From 595f60febb6d73fd8ea5a52c141779e06c2e9c2f Mon Sep 17 00:00:00 2001
From: Mansard <nmansard@laas.fr>
Date: Mon, 14 Mar 2011 16:03:55 +0100
Subject: [PATCH] Correct exception throwing from C++ to rely raise something
 in the interpreter.

---
 src/dynamic-graph-py.cc | 10 +++++-----
 src/entity-py.cc        | 26 ++++++++++++++------------
 src/factory-py.cc       |  2 --
 src/signal-base-py.cc   | 35 ++++++++++++++++++++---------------
 src/signal-caster-py.cc |  2 --
 5 files changed, 39 insertions(+), 36 deletions(-)

diff --git a/src/dynamic-graph-py.cc b/src/dynamic-graph-py.cc
index 08ca7c8..aed5d53 100644
--- a/src/dynamic-graph-py.cc
+++ b/src/dynamic-graph-py.cc
@@ -57,7 +57,7 @@ namespace dynamicgraph {
       PyObject* getSignalTypeList(PyObject* self, PyObject* args);
     }
 
-    PyObject* error;
+    PyObject* dgpyError;
 
     /**
        \brief plug a signal into another one.
@@ -95,7 +95,7 @@ namespace dynamicgraph {
       try {
 	signalIn->plug(signalOut);
       } catch (std::exception& exc) {
-	PyErr_SetString(error, exc.what());
+	PyErr_SetString(dgpyError, exc.what());
 	return NULL;
       }
       return Py_BuildValue("");
@@ -212,8 +212,8 @@ initwrap(void)
 
     std::string msg("dynamic_graph.error");
 
-    dynamicgraph::python::error =
+    dynamicgraph::python::dgpyError =
       PyErr_NewException(const_cast<char*>(msg.c_str()), NULL, NULL);
-    Py_INCREF(dynamicgraph::python::error);
-    PyModule_AddObject(m, "error", dynamicgraph::python::error);
+    Py_INCREF(dynamicgraph::python::dgpyError);
+    PyModule_AddObject(m, "error", dynamicgraph::python::dgpyError);
 }
diff --git a/src/entity-py.cc b/src/entity-py.cc
index 976a2b8..2942665 100644
--- a/src/entity-py.cc
+++ b/src/entity-py.cc
@@ -35,7 +35,7 @@ using dynamicgraph::Matrix;
 namespace dynamicgraph {
   namespace python {
 
-    extern PyObject* error;
+    extern PyObject* dgpyError;
     using namespace convert;
 
     namespace entity {
@@ -65,7 +65,7 @@ namespace dynamicgraph {
 	      obj = dynamicgraph::g_factory.newEntity(std::string(className),
 						      std::string(instanceName));
 	    } catch (std::exception& exc) {
-	      PyErr_SetString(error, exc.what());
+	      PyErr_SetString(dgpyError, exc.what());
 	      return NULL;
 	    }
 	  }
@@ -97,7 +97,7 @@ namespace dynamicgraph {
 	try {
 	 name = entity->getName();
 	} catch(ExceptionAbstract& exc) {
-	  PyErr_SetString(error, exc.getStringMessage().c_str());
+	  PyErr_SetString(dgpyError, exc.getStringMessage().c_str());
 	  return NULL;
 	}
 	return Py_BuildValue("s", name.c_str());
@@ -128,7 +128,7 @@ namespace dynamicgraph {
 	try {
 	  signal = &(entity->getSignal(std::string(name)));
 	} catch(ExceptionAbstract& exc) {
-	  PyErr_SetString(error, exc.getStringMessage().c_str());
+	  PyErr_SetString(dgpyError, exc.getStringMessage().c_str());
 	  return NULL;
 	}
 	// Return the pointer to the signal without destructor since the signal
@@ -165,7 +165,8 @@ namespace dynamicgraph {
 	  }
 	  return result;
 	} catch(ExceptionAbstract& exc) {
-	  PyErr_SetString(error, exc.getStringMessage().c_str());
+	  PyErr_SetString(dgpyError, exc.getStringMessage().c_str());
+	  return NULL;
 	}
 	return NULL;
       }
@@ -202,7 +203,7 @@ namespace dynamicgraph {
 	if (commandMap.count(std::string(commandName)) != 1) {
 	  std::string msg = "command " + std::string(commandName) +
 	    " is not referenced in Entity " + entity->getName();
-	  PyErr_SetString(error, msg.c_str());
+	  PyErr_SetString(dgpyError, msg.c_str());
 	  return NULL;
 	}
 	Command* command = commandMap[std::string(commandName)];
@@ -212,7 +213,7 @@ namespace dynamicgraph {
 	  std::stringstream ss;
 	  ss << "command takes " <<  typeVector.size()
 	     << " parameters, " << size << " given.";
-	  PyErr_SetString(error, ss.str().c_str());
+	  PyErr_SetString(dgpyError, ss.str().c_str());
 	  return NULL;
 	}
 
@@ -227,7 +228,7 @@ namespace dynamicgraph {
 	    std::stringstream ss;
 	    ss << "Error while parsing argument " << iParam+1 << ": "
 	       << exc.what() << ".";
-	    PyErr_SetString(error, ss.str().c_str()) ;
+	    PyErr_SetString(dgpyError, ss.str().c_str()) ;
 	    return NULL;
 	  }
 	}
@@ -236,7 +237,7 @@ namespace dynamicgraph {
 	  Value result = command->execute();
 	  return valueToPython(result);
 	} catch (const std::exception& exc) {
-	  PyErr_SetString(error, exc.what()) ;
+	  PyErr_SetString(dgpyError, exc.what()) ;
 	  return NULL;
 	}
 	return NULL;
@@ -282,7 +283,7 @@ namespace dynamicgraph {
 
 	// Retrieve the entity instance
 	if (!PyCObject_Check(object)) {
-	  PyErr_SetString(error, "first argument is not an object");
+	  PyErr_SetString(dgpyError, "first argument is not an object");
 	  return NULL;
 	}
 	void* pointer = PyCObject_AsVoidPtr(object);
@@ -293,7 +294,8 @@ namespace dynamicgraph {
 	try {
 	  command = map[commandName];
 	} catch (const std::exception& exc) {
-	  PyErr_SetString(error, exc.what());
+	  PyErr_SetString(dgpyError, exc.what());
+	  return NULL;
 	}
 	std::string docstring = command->getDocstring();
 	return Py_BuildValue("s", docstring.c_str());
@@ -306,7 +308,7 @@ namespace dynamicgraph {
 	if (!PyArg_ParseTuple(args, "O", &object)
 	    || (!PyCObject_Check(object)) )
 	  {
-	    PyErr_SetString(error, "first argument is not an object");
+	    PyErr_SetString(dgpyError, "first argument is not an object");
 	    return NULL;
 	  }
 	void* pointer = PyCObject_AsVoidPtr(object);
diff --git a/src/factory-py.cc b/src/factory-py.cc
index 12fbc9b..a821440 100644
--- a/src/factory-py.cc
+++ b/src/factory-py.cc
@@ -22,8 +22,6 @@ using dynamicgraph::ExceptionAbstract;
 
 namespace dynamicgraph {
   namespace python {
-    
-    extern PyObject* error;
 
     namespace factory {
 
diff --git a/src/signal-base-py.cc b/src/signal-base-py.cc
index 21cef5f..93b7984 100644
--- a/src/signal-base-py.cc
+++ b/src/signal-base-py.cc
@@ -28,11 +28,12 @@ using dynamicgraph::SignalBase;
 namespace dynamicgraph {
   namespace python {
 
-    extern PyObject* error;
+    extern PyObject* dgpyError;
     using namespace convert;
 
     namespace signalBase {
 
+
       static void destroy (void* self);
 
       /**
@@ -85,7 +86,7 @@ namespace dynamicgraph {
 	if (!PyArg_ParseTuple(args,"Oi", &object, &time))
 	  return NULL;
 	if (!PyCObject_Check(object)) {
-	  PyErr_SetString(error, "object should be a C object");
+	  PyErr_SetString(dgpyError, "object should be a C object");
 	  return NULL;
 	}
 
@@ -112,7 +113,7 @@ namespace dynamicgraph {
 	try {
 	  obj->display(oss);
 	} catch (std::exception& exc) {
-	  PyErr_SetString(error, exc.what());
+	  PyErr_SetString(dgpyError, exc.what());
 	  return NULL;
 	}
 	return Py_BuildValue("s", oss.str().c_str());
@@ -135,7 +136,7 @@ namespace dynamicgraph {
 	try {
 	  obj->displayDependencies(oss,time);
 	} catch (std::exception& exc) {
-	  PyErr_SetString(error, exc.what());
+	  PyErr_SetString(dgpyError, exc.what());
 	  return NULL;
 	}
 	return Py_BuildValue("s", oss.str().c_str());
@@ -180,12 +181,13 @@ namespace dynamicgraph {
 	try {
 	  signal->get(value);
 	} catch (const dynamicgraph::ExceptionAbstract& exc) {
-	  PyErr_SetString(error, exc.getStringMessage().c_str());
+	  PyErr_SetString(dgpyError, exc.getStringMessage().c_str());
 	  return NULL;
 	} catch (const std::exception& exc) {
-	  PyErr_SetString(error, exc.what());
+	  PyErr_SetString(dgpyError, exc.what());
+	  return NULL;
 	} catch (...) {
-	  PyErr_SetString(error, "Unknown exception");
+	  PyErr_SetString(dgpyError, "Unknown exception");
 	  return NULL;
 	}
 	std::string valueString = value.str();
@@ -208,12 +210,13 @@ namespace dynamicgraph {
 	try {
 	  name = signal->getName();
 	} catch (const dynamicgraph::ExceptionAbstract& exc) {
-	  PyErr_SetString(error, exc.getStringMessage().c_str());
+	  PyErr_SetString(dgpyError, exc.getStringMessage().c_str());
 	  return NULL;
 	} catch (const std::exception& exc) {
-	  PyErr_SetString(error, exc.what());
+	  PyErr_SetString(dgpyError, exc.what());
+	  return NULL;
 	} catch (...) {
-	  PyErr_SetString(error, "Unknown exception");
+	  PyErr_SetString(dgpyError, "Unknown exception");
 	  return NULL;
 	}
 	return Py_BuildValue("s", name.c_str());
@@ -239,13 +242,13 @@ namespace dynamicgraph {
 	try {
 	  signal->set(value);
 	} catch (const dynamicgraph::ExceptionAbstract& exc) {
-	  PyErr_SetString(error, exc.getStringMessage().c_str());
+	  PyErr_SetString(dgpyError, exc.getStringMessage().c_str());
 	  return NULL;
 	} catch (const std::exception& exc) {
-	  PyErr_SetString(error, exc.what());
+	  PyErr_SetString(dgpyError, exc.what());
 	  return NULL;
 	} catch (...) {
-	  PyErr_SetString(error, "Unknown exception");
+	  PyErr_SetString(dgpyError, "Unknown exception");
 	  return NULL;
 	}
 
@@ -267,7 +270,8 @@ namespace dynamicgraph {
 	try {
 	  signal->recompute(time);
 	} catch (const std::exception& exc) {
-	  PyErr_SetString(error, exc.what());
+	  PyErr_SetString(dgpyError, exc.what());
+	  return NULL;
 	}
 	return Py_BuildValue("");
       }
@@ -286,7 +290,8 @@ namespace dynamicgraph {
 	try {
 	  signal->unplug();
 	} catch (const std::exception& exc) {
-	  PyErr_SetString(error, exc.what());
+	  PyErr_SetString(dgpyError, exc.what());
+	  return NULL;
 	}
 	return Py_BuildValue("");
       }
diff --git a/src/signal-caster-py.cc b/src/signal-caster-py.cc
index dff8e53..2b71854 100644
--- a/src/signal-caster-py.cc
+++ b/src/signal-caster-py.cc
@@ -22,8 +22,6 @@
 namespace dynamicgraph {
   namespace python {
 
-    extern PyObject* error;
-
     namespace signalCaster {
       PyObject* getSignalTypeList(PyObject* /*self*/, PyObject* args)
       {
-- 
GitLab