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