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