[PATCH] Exception handling: Added option to disable exception

Matthias Goldhoorn matthias.goldhoorn at dfki.de
Thu Oct 17 14:58:28 CEST 2013


This make the life for developers much easier. Let the Exception Raise
so that the user could use gdb for backtracke analysis. Only for Debuggig
purposes.
---
 CMakeLists.txt          |    5 +++++
 rtt/ExecutionEngine.cpp |   16 ++++++++++++++++
 rtt/base/TaskCore.cpp   |   20 ++++++++++++++++++++
 rtt/os/Thread.cpp       |   16 +++++++++-------
 4 files changed, 50 insertions(+), 7 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 912ae83..fdda247 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -79,6 +79,11 @@ endif( NOT OROCOS_SUFFIX )
 #                                                 #
 ###################################################
 
+OPTION(CATCH_EXCEPTION "Should RTT Catch Exceptions? Disable for debugging only." ON)
+if(CATCH_EXCEPTION)
+    ADD_DEFINITIONS("-DCATCH_EXCEPTION")
+endif()
+
 OPTION(ENABLE_TESTS "Turn on to enable the testing framework." OFF)
 SET(BUILD_TEST_TIMEOUT 1500 CACHE STRING "Global timeout on all tests (seconds).")
 IF(ENABLE_TESTS)
diff --git a/rtt/ExecutionEngine.cpp b/rtt/ExecutionEngine.cpp
index 4bde246..a53b1fa 100644
--- a/rtt/ExecutionEngine.cpp
+++ b/rtt/ExecutionEngine.cpp
@@ -328,9 +328,12 @@ namespace RTT
         if ( taskc ) {
             // A trigger() in startHook() will be ignored, we trigger in TaskCore after startHook finishes.
             if ( taskc->mTaskState == TaskCore::Running && taskc->mTargetState == TaskCore::Running ) {
+#ifdef CATCH_EXCEPTION 
                 try {
+#endif 
                     taskc->prepareUpdateHook();
                     taskc->updateHook();
+#ifdef CATCH_EXCEPTION 
                 } catch(std::exception const& e) {
                     log(Error) << "in updateHook(): switching to exception state because of unhandled exception" << endlog();
                     log(Error) << "  " << e.what() << endlog();
@@ -339,11 +342,15 @@ namespace RTT
                     log(Error) << "in updateHook(): switching to exception state because of unhandled exception" << endlog();
                     taskc->exception(); // calls stopHook,cleanupHook
                 }
+#endif
             }
             // in case start() or updateHook() called error(), this will be called:
             if (  taskc->mTaskState == TaskCore::RunTimeError ) {
+#ifdef CATCH_EXCEPTION 
                 try {
+#endif
                     taskc->errorHook();
+#ifdef CATCH_EXCEPTION 
                 } catch(std::exception const& e) {
                     log(Error) << "in errorHook(): switching to exception state because of unhandled exception" << endlog();
                     log(Error) << "  " << e.what() << endlog();
@@ -352,6 +359,7 @@ namespace RTT
                     log(Error) << "in errorHook(): switching to exception state because of unhandled exception" << endlog();
                     taskc->exception(); // calls stopHook,cleanupHook
                 }
+#endif
             }
         }
         if ( !this->getActivity() || ! this->getActivity()->isRunning() ) return;
@@ -359,9 +367,12 @@ namespace RTT
         // call all children as well.
         for (std::vector<TaskCore*>::iterator it = children.begin(); it != children.end();++it) {
             if ( (*it)->mTaskState == TaskCore::Running  && (*it)->mTargetState == TaskCore::Running  )
+#ifdef CATCH_EXCEPTION 
                 try {
+#endif
                     (*it)->prepareUpdateHook();
                     (*it)->updateHook();
+#ifdef CATCH_EXCEPTION 
                 } catch(std::exception const& e) {
                     log(Error) << "in updateHook(): switching to exception state because of unhandled exception" << endlog();
                     log(Error) << "  " << e.what() << endlog();
@@ -370,9 +381,13 @@ namespace RTT
                     log(Error) << "in updateHook(): switching to exception state because of unhandled exception" << endlog();
                     (*it)->exception(); // calls stopHook,cleanupHook
                 }
+#endif
             if (  (*it)->mTaskState == TaskCore::RunTimeError )
+#ifdef CATCH_EXCEPTION 
                 try {
+#endif
                     (*it)->errorHook();
+#ifdef CATCH_EXCEPTION 
                 } catch(std::exception const& e) {
                     log(Error) << "in errorHook(): switching to exception state because of unhandled exception" << endlog();
                     log(Error) << "  " << e.what() << endlog();
@@ -381,6 +396,7 @@ namespace RTT
                     log(Error) << "in errorHook(): switching to exception state because of unhandled exception" << endlog();
                     (*it)->exception(); // calls stopHook,cleanupHook
                 }
+#endif
             if ( !this->getActivity() || ! this->getActivity()->isRunning() ) return;
         }
     }
diff --git a/rtt/base/TaskCore.cpp b/rtt/base/TaskCore.cpp
index 3093583..2f8a0e3 100644
--- a/rtt/base/TaskCore.cpp
+++ b/rtt/base/TaskCore.cpp
@@ -102,7 +102,9 @@ namespace RTT {
 
     bool TaskCore::configure() {
         if ( mTaskState == Stopped || mTaskState == PreOperational) {
+#ifdef CATCH_EXCEPTION 
             try {
+#endif
                 mTargetState = Stopped;
                 if (configureHook() ) {
                     mTaskState = Stopped;
@@ -111,6 +113,7 @@ namespace RTT {
                     mTargetState = mTaskState = PreOperational;
                     return false;
                 }
+#ifdef CATCH_EXCEPTION 
             } catch(std::exception const& e) {
                 log(Error) << "in configure(): switching to exception state because of unhandled exception" << endlog();
                 log(Error) << "  " << e.what() << endlog();
@@ -119,17 +122,21 @@ namespace RTT {
                 log(Error) << "in configure(): switching to exception state because of unhandled exception" << endlog();
                 exception();
             }
+#endif
         }
         return false; // no configure when running.
     }
 
     bool TaskCore::cleanup() {
         if ( mTaskState == Stopped ) {
+#ifdef CATCH_EXCEPTION 
             try {
+#endif
                 mTargetState = PreOperational;
                 cleanupHook();
                 mTaskState = PreOperational;
                 return true;
+#ifdef CATCH_EXCEPTION 
             } catch(std::exception const& e) {
                 log(Error) << "in cleanup(): switching to exception state because of unhandled exception" << endlog();
                 log(Error) << "  " << e.what() << endlog();
@@ -138,6 +145,7 @@ namespace RTT {
                 log(Error) << "in cleanup(): switching to exception state because of unhandled exception" << endlog();
                 exception();
             }
+#endif
         }
         return false; // no cleanup when running or not configured.
     }
@@ -159,7 +167,9 @@ namespace RTT {
         //log(Error) <<"Exception happend in TaskCore."<<endlog();
         TaskState copy = mTaskState;
         mTargetState = mTaskState = Exception;
+#ifdef CATCH_EXCEPTION 
         try {
+#endif
             if ( copy >= Running ) {
                 stopHook();
             }
@@ -167,6 +177,7 @@ namespace RTT {
                 cleanupHook();
             }
             exceptionHook();
+#ifdef CATCH_EXCEPTION 
         } catch(std::exception const& e) {
             log(RTT::Error) << "stopHook(), cleanupHook() and/or exceptionHook() raised " << e.what() << ", going into Fatal" << endlog();
             fatal();
@@ -175,6 +186,7 @@ namespace RTT {
             log(Error) << "stopHook(), cleanupHook() and/or exceptionHook() raised an exception, going into Fatal" << endlog();
             fatal();
         }
+#endif
     }
 
     bool TaskCore::recover() {
@@ -191,7 +203,9 @@ namespace RTT {
 
     bool TaskCore::start() {
         if ( mTaskState == Stopped ) {
+#ifdef CATCH_EXCEPTION 
             try {
+#endif
                 mTargetState = Running;
                 if ( startHook() ) {
                     mTaskState = Running;
@@ -199,6 +213,7 @@ namespace RTT {
                     return true;
                 }
                 mTargetState = Stopped;
+#ifdef CATCH_EXCEPTION 
             } catch(std::exception const& e) {
                 log(Error) << "in start(): switching to exception state because of unhandled exception" << endlog();
                 log(Error) << "  " << e.what() << endlog();
@@ -207,6 +222,7 @@ namespace RTT {
                 log(Error) << "in start(): switching to exception state because of unhandled exception" << endlog();
                 exception();
             }
+#endif
         }
         return false;
     }
@@ -214,7 +230,9 @@ namespace RTT {
     bool TaskCore::stop() {
         TaskState orig = mTaskState;
         if ( mTaskState >= Running ) {
+#ifdef CATCH_EXCEPTION 
             try {
+#endif
                 mTargetState = Stopped;
                 if ( engine()->stopTask(this) ) {
                     stopHook();
@@ -224,6 +242,7 @@ namespace RTT {
                     mTaskState = orig;
                     mTargetState = orig;
                 }
+#ifdef CATCH_EXCEPTION 
             } catch(std::exception const& e) {
                 log(Error) << "in stop(): switching to exception state because of unhandled exception" << endlog();
                 log(Error) << "  " << e.what() << endlog();
@@ -232,6 +251,7 @@ namespace RTT {
                 log(Error) << "in stop(): switching to exception state because of unhandled exception" << endlog();
                 exception();
             }
+#endif
         }
         return false;
     }
diff --git a/rtt/os/Thread.cpp b/rtt/os/Thread.cpp
index 1a0159d..d8a5ef0 100644
--- a/rtt/os/Thread.cpp
+++ b/rtt/os/Thread.cpp
@@ -53,13 +53,15 @@
 #define SCOPE_OFF
 #endif
 
-#ifndef ORO_EMBEDDED
+#if !defined(ORO_EMBEDDED) and defined(CATCH_EXCEPTION)
 #define TRY try
 #define CATCH(a) catch(a)
+#define CATCH_CONTEND
 #define CATCH_ALL catch(...)
 #else
 #define TRY
 #define CATCH(a) if (false)
+#define CATCH_CONTEND std::exception const e; 
 #define CATCH_ALL if (false)
 #endif
 
@@ -137,13 +139,12 @@ namespace RTT {
                                 MutexLock lock(task->breaker);
                                 while(task->running && !task->prepareForExit )
                                 {
-                                    try
+                                    TRY 
                                     {
                                         SCOPE_ON
                                         task->step(); // one cycle
                                         SCOPE_OFF
-                                    }
-                                    catch(...)
+                                    } CATCH_ALL 
                                     {
                                         SCOPE_OFF
                                         throw;
@@ -179,7 +180,7 @@ namespace RTT {
                                     break; // break while(1) {}
                             }
                             else // non periodic:
-                            try
+                            TRY 
                             {
                                 // this mutex guarantees that stop() waits
                                 // until loop() returns.
@@ -190,8 +191,8 @@ namespace RTT {
                                 task->loop();
                                 SCOPE_OFF
                                 task->inloop = false;
-                            }
-                            catch(...) {
+                            } CATCH_ALL
+                            {
                                 SCOPE_OFF
                                 task->inloop = false;
                                 throw;
@@ -211,6 +212,7 @@ namespace RTT {
                     }
                 } CATCH(std::exception const& e)
                 {
+                    CATCH_CONTEND
                     SCOPE_OFF
                     task->emergencyStop();
                     Logger::In in(rtos_task_get_name(task->getTask()));
-- 
1.7.10.4


--------------050709060403060200090402--


More information about the Rock-dev mailing list