[C++-sig] How to turn C++ error codes into Python exceptions?
Matthias Baas
baas at ira.uka.de
Mon Mar 27 09:57:25 CEST 2006
Hi,
I'm currently wrapping a library that uses dedicated status objects for
passing around error information (basically, those status objects just
contain an error code). A function either returns such a status object
or it expects an optional pointer to such an object which it then uses
for indicating whether the function was successful or not.
In the Python bindings I want the functions to raise an exception if
something went wrong. Now the question is, what's the best way to
accomplish this using Boost.Python?
I suppose the most straightforward (but tedious) way would be to write a
wrapper for each function. For example, if I have a function
bool isSelected(MObject& object, MStatus* ReturnStatus=NULL)
I could write a wrapper:
bool isSelected_wrapped(MObject& object, MStatus* ReturnStatus=NULL)
{
MStatus internalstat;
MStatus* finalstat=&internalstat;
// If the user provided a MStatus object then use this one...
if (ReturnStatus!=NULL)
{
finalstat = ReturnStatus;
}
// Call the original function...
bool res = isSelected(object, finalstat);
// Check for errors...
if (exceptions_enabled && finalstat->error())
{
throw AnAppropriateException();
}
return res;
}
But as there are a lot of functions that have to be wrapped that way I'm
wondering if there is some more automated solution. Would it be possible
to write custom call policy objects that do the above tests
automatically whenever a function has an argument of type MStatus*?
In the other case that a function returns a status object, would it be
possible to apply a custom to_python converter that actually does not
convert the result but perform an error check and throw an exception if
an error has occurred?
- Matthias -
More information about the Cplusplus-sig
mailing list