diff --git a/Code/ApplicationEngine/otbWrapperApplication.cxx b/Code/ApplicationEngine/otbWrapperApplication.cxx
index 2c07223b01df4da6e90a7b7a4708aa156ca05879..55f7832067226106869062da1692651d77739a29 100644
--- a/Code/ApplicationEngine/otbWrapperApplication.cxx
+++ b/Code/ApplicationEngine/otbWrapperApplication.cxx
@@ -127,76 +127,93 @@ bool Application::Execute()
   return ret;
 }
 
-void Application::ExecuteAndWriteOutput()
-{
-  if (this->Execute())
-    {
-    std::vector<std::string> paramList = GetParametersKeys(true);
-    // First Get the value of the available memory to use with the
-    // writer if a RAMParameter is set
-    bool useRAM = false;
-    unsigned int ram = 256;
-    for (std::vector<std::string>::const_iterator it = paramList.begin();
-         it != paramList.end();
-         ++it)
-      {
-      std::string key = *it;
-      if (GetParameterType(key) == ParameterType_RAM
-        && IsParameterEnabled(key))
-        {
-        Parameter* param = GetParameterByKey(key);
-        RAMParameter* ramParam = dynamic_cast<RAMParameter*>(param);
-        ram = ramParam->GetValue();
-        useRAM = true;
-        }
-      }
+bool Application::ExecuteAndWriteOutput()
+{
+  bool status = this->Execute();
 
-    for (std::vector<std::string>::const_iterator it = paramList.begin();
-         it != paramList.end();
-         ++it)
+  if (status)
+    {
+    try
       {
-      std::string key = *it;
-      if (GetParameterType(key) == ParameterType_OutputImage
-          && IsParameterEnabled(key) && HasValue(key) )
+      std::vector<std::string> paramList = GetParametersKeys(true);
+      // First Get the value of the available memory to use with the
+      // writer if a RAMParameter is set
+      bool useRAM = false;
+      unsigned int ram = 256;
+      for (std::vector<std::string>::const_iterator it = paramList.begin();
+           it != paramList.end();
+           ++it)
         {
-        Parameter* param = GetParameterByKey(key);
-        OutputImageParameter* outputParam = dynamic_cast<OutputImageParameter*>(param);
-        outputParam->InitializeWriters();
-        if (useRAM)
+        std::string key = *it;
+        if (GetParameterType(key) == ParameterType_RAM
+          && IsParameterEnabled(key))
           {
-          outputParam->SetRAMValue(ram);
+          Parameter* param = GetParameterByKey(key);
+          RAMParameter* ramParam = dynamic_cast<RAMParameter*>(param);
+          ram = ramParam->GetValue();
+          useRAM = true;
           }
-        std::ostringstream progressId;
-        progressId << "Writing " << outputParam->GetFileName() << "...";
-        AddProcess(outputParam->GetWriter(), progressId.str());
-        outputParam->Write();
-        }
-      else if (GetParameterType(key) == ParameterType_OutputVectorData
-               && IsParameterEnabled(key) && HasValue(key) )
-        {
-        Parameter* param = GetParameterByKey(key);
-        OutputVectorDataParameter* outputParam = dynamic_cast<OutputVectorDataParameter*>(param);
-        outputParam->InitializeWriters();
-        std::ostringstream progressId;
-        progressId << "Writing " << outputParam->GetFileName() << "...";
-        AddProcess(outputParam->GetWriter(), progressId.str());
-        outputParam->Write();
         }
-      else if (GetParameterType(key) == ParameterType_ComplexOutputImage
-               && IsParameterEnabled(key) && HasValue(key) )
+
+      for (std::vector<std::string>::const_iterator it = paramList.begin();
+           it != paramList.end();
+           ++it)
         {
-        Parameter* param = GetParameterByKey(key);
-        ComplexOutputImageParameter* outputParam = dynamic_cast<ComplexOutputImageParameter*>(param);
-        outputParam->InitializeWriters();
-        if (useRAM)
+        std::string key = *it;
+        if (GetParameterType(key) == ParameterType_OutputImage
+            && IsParameterEnabled(key) && HasValue(key) )
           {
-          outputParam->SetRAMValue(ram);
+          Parameter* param = GetParameterByKey(key);
+          OutputImageParameter* outputParam = dynamic_cast<OutputImageParameter*>(param);
+          outputParam->InitializeWriters();
+          if (useRAM)
+            {
+            outputParam->SetRAMValue(ram);
+            }
+          std::ostringstream progressId;
+          progressId << "Writing " << outputParam->GetFileName() << "...";
+          AddProcess(outputParam->GetWriter(), progressId.str());
+          outputParam->Write();
+          }
+        else if (GetParameterType(key) == ParameterType_OutputVectorData
+                 && IsParameterEnabled(key) && HasValue(key) )
+          {
+          Parameter* param = GetParameterByKey(key);
+          OutputVectorDataParameter* outputParam = dynamic_cast<OutputVectorDataParameter*>(param);
+          outputParam->InitializeWriters();
+          std::ostringstream progressId;
+          progressId << "Writing " << outputParam->GetFileName() << "...";
+          AddProcess(outputParam->GetWriter(), progressId.str());
+          outputParam->Write();
+          }
+        else if (GetParameterType(key) == ParameterType_ComplexOutputImage
+                 && IsParameterEnabled(key) && HasValue(key) )
+          {
+          Parameter* param = GetParameterByKey(key);
+          ComplexOutputImageParameter* outputParam = dynamic_cast<ComplexOutputImageParameter*>(param);
+          outputParam->InitializeWriters();
+          if (useRAM)
+            {
+            outputParam->SetRAMValue(ram);
+            }
+          AddProcess(outputParam->GetWriter(),"Complex Writer");
+          outputParam->Write();
           }
-        AddProcess(outputParam->GetWriter(),"Complex Writer");
-        outputParam->Write();
         }
       }
+    catch(std::exception& err)
+      {
+      status = false;
+      otbAppLogFATAL(<<err.what());
+      }
+    catch(...)
+      {
+      status = false;
+      otbAppLogFATAL(<<"Unknown exception thrown.");
+      }
     }
+
+  return status;
 }
 
 /* Enable the use of an optional parameter. Returns the previous state */
diff --git a/Code/ApplicationEngine/otbWrapperApplication.h b/Code/ApplicationEngine/otbWrapperApplication.h
index 0b515919f7ecda2d8496eeeccd3a3e053f22c21b..de90a5666cc3f78e00e873e923dd07ba543b7784 100644
--- a/Code/ApplicationEngine/otbWrapperApplication.h
+++ b/Code/ApplicationEngine/otbWrapperApplication.h
@@ -83,14 +83,19 @@ public:
    * the output image or vector data parameters as pointers.
    *
    * In other cases, the application must handle
-   * the I/O (intermediary results for example) */
+   * the I/O (intermediary results for example)
+   *
+   * Returns true on success, false on failure
+   */
   bool Execute();
 
   /** Run the application, then writes all the output to disk
    * if they have an associated filename.
    * This is a helper function for wrappers without pipeline support.
+   *
+   * Returns true on success, false on failure
    */
-  void ExecuteAndWriteOutput();
+  bool ExecuteAndWriteOutput();
 
   /* Get the internal application parameters
    *
diff --git a/Code/Wrappers/SWIG/otbApplication.i b/Code/Wrappers/SWIG/otbApplication.i
index e98dab638604b7bf320c7166be848338998338dc..c721d31341efd479bef38eacb478085d5e05f4ed 100644
--- a/Code/Wrappers/SWIG/otbApplication.i
+++ b/Code/Wrappers/SWIG/otbApplication.i
@@ -113,8 +113,8 @@ public:
 
   void Init();
   void UpdateParameters();
-  void Execute();
-  void ExecuteAndWriteOutput();
+  bool Execute();
+  bool ExecuteAndWriteOutput();
   
   std::vector<std::string> GetParametersKeys(bool recursive = true);
   std::string GetParameterName(std::string);