Improvements in error handling at Python-C++ boundaries.

This commit is contained in:
2009-03-20 22:41:27 +00:00
parent 6ba34d18b5
commit 0c7e5323e8
24 changed files with 280 additions and 227 deletions

View File

@@ -207,19 +207,24 @@ PyObject * UnaryPredicate1D___call__( BPy_UnaryPredicate1D *self, PyObject *args
{
PyObject *py_if1D;
if(!( PyArg_ParseTuple(args, "O", &py_if1D) && BPy_Interface1D_Check(py_if1D) )) {
cout << "ERROR: UnaryPredicate1D___call__ " << endl;
if( !PyArg_ParseTuple(args, "O!", &Interface1D_Type, &py_if1D) )
return NULL;
}
Interface1D *if1D = ((BPy_Interface1D *) py_if1D)->if1D;
if( if1D )
return PyBool_from_bool( self->up1D->operator()(*if1D) );
else
cerr << "ERROR: UnaryPredicate1D___call__ (no Interface1D)" << endl;
Py_RETURN_NONE;
if( !if1D ) {
string msg(self->up1D->getName() + " has no Interface0DIterator");
PyErr_SetString(PyExc_RuntimeError, msg.c_str());
return NULL;
}
if( self->up1D->operator()(*if1D) < 0 ) {
if (!PyErr_Occurred()) {
string msg(self->up1D->getName() + " __call__ method failed");
PyErr_SetString(PyExc_RuntimeError, msg.c_str());
}
return NULL;
}
return PyBool_from_bool( self->up1D->result );
}