Skip to content
Snippets Groups Projects
Commit 7e5e1ce4 authored by Florent Lamiraux's avatar Florent Lamiraux Committed by Florent Lamiraux florent@laas.fr
Browse files

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.
parent 8fc08b88
No related branches found
No related tags found
No related merge requests found
...@@ -154,28 +154,35 @@ namespace dynamicgraph { ...@@ -154,28 +154,35 @@ namespace dynamicgraph {
pointer = PyCObject_AsVoidPtr(object); pointer = PyCObject_AsVoidPtr(object);
SignalBase<int>* signal = (SignalBase<int>*)pointer; SignalBase<int>* signal = (SignalBase<int>*)pointer;
/* Temptative for specific signal type. */ try {
Signal<dynamicgraph::Vector,int> * sigvec /* Temptative for specific signal type. */
= dynamic_cast< Signal<dynamicgraph::Vector,int>* >( signal ); Signal<dynamicgraph::Vector,int> * sigvec
if( NULL!= sigvec ) = dynamic_cast< Signal<dynamicgraph::Vector,int>* >( signal );
{ if( NULL!= sigvec )
return vectorToPython( sigvec->accessCopy() ); {
} return vectorToPython( sigvec->accessCopy() );
}
Signal<dynamicgraph::Matrix,int> * sigmat
= dynamic_cast< Signal<dynamicgraph::Matrix,int>* >( signal ); Signal<dynamicgraph::Matrix,int> * sigmat
if( NULL!= sigmat ) = dynamic_cast< Signal<dynamicgraph::Matrix,int>* >( signal );
{ if( NULL!= sigmat )
return matrixToPython( sigmat->accessCopy() ); {
} return matrixToPython( sigmat->accessCopy() );
}
Signal<double,int> * sigdouble
= dynamic_cast< Signal<double,int>* >( signal ); Signal<double,int> * sigdouble
if( NULL!= sigdouble ) = dynamic_cast< Signal<double,int>* >( signal );
{ if( NULL!= sigdouble )
return Py_BuildValue("d", sigdouble->accessCopy() ); {
} 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. */ /* Non specific signal: use a generic way. */
std::ostringstream value; std::ostringstream value;
try { try {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment