From 7e5e1ce426c05b1f00707eb312cef96fb2c54cbd Mon Sep 17 00:00:00 2001 From: Florent Lamiraux <florent@laas.fr> Date: Wed, 7 Mar 2012 12:00:53 +0100 Subject: [PATCH] Catch exceptions in getValue of signal-base-py.cc Throwing an exception in the C/Python API makes the python interpreter terminate. The correct way is to catch C++ exception and to raise python errors with the same message. --- src/signal-base-py.cc | 51 ++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/src/signal-base-py.cc b/src/signal-base-py.cc index 9832daf..bbbf8db 100644 --- a/src/signal-base-py.cc +++ b/src/signal-base-py.cc @@ -154,28 +154,35 @@ namespace dynamicgraph { pointer = PyCObject_AsVoidPtr(object); SignalBase<int>* signal = (SignalBase<int>*)pointer; - /* Temptative for specific signal type. */ - Signal<dynamicgraph::Vector,int> * sigvec - = dynamic_cast< Signal<dynamicgraph::Vector,int>* >( signal ); - if( NULL!= sigvec ) - { - return vectorToPython( sigvec->accessCopy() ); - } - - Signal<dynamicgraph::Matrix,int> * sigmat - = dynamic_cast< Signal<dynamicgraph::Matrix,int>* >( signal ); - if( NULL!= sigmat ) - { - return matrixToPython( sigmat->accessCopy() ); - } - - Signal<double,int> * sigdouble - = dynamic_cast< Signal<double,int>* >( signal ); - if( NULL!= sigdouble ) - { - return Py_BuildValue("d", sigdouble->accessCopy() ); - } - + try { + /* Temptative for specific signal type. */ + Signal<dynamicgraph::Vector,int> * sigvec + = dynamic_cast< Signal<dynamicgraph::Vector,int>* >( signal ); + if( NULL!= sigvec ) + { + return vectorToPython( sigvec->accessCopy() ); + } + + Signal<dynamicgraph::Matrix,int> * sigmat + = dynamic_cast< Signal<dynamicgraph::Matrix,int>* >( signal ); + if( NULL!= sigmat ) + { + return matrixToPython( sigmat->accessCopy() ); + } + + Signal<double,int> * sigdouble + = dynamic_cast< Signal<double,int>* >( signal ); + if( NULL!= sigdouble ) + { + return Py_BuildValue("d", sigdouble->accessCopy() ); + } + } catch (const std::exception& exc) { + PyErr_SetString(dgpyError, exc.what()); + return NULL; + } catch (...) { + PyErr_SetString(dgpyError, "Unknown exception"); + return NULL; + } /* Non specific signal: use a generic way. */ std::ostringstream value; try { -- GitLab