I have some glue code that calls a C++ function which can raise an unsuitable_error exception. I have an exception translator which will convert that to a more pythonic version (UnsuitableError), but when I use that I get an "SystemError: 'finally' pops bad exception" error on the python side. As far as I can see my code looks correct, but I suspect I am overlooking something trivial somewhere.

using namespace boost::python;

class UnsuitableError : public std::exception {
public:
    UnsuitableError() : reasons() { }
    ~UnsuitableError() throw() {}
    boost::python::list reasons;
};

namespace {
    PyObject *UnsuitableErrorType = NULL;

    void translator(const unsuitable_error &e) {
        std::list<const char*>::const_iterator i;
        PyObject* unicode;
        UnsuitableError error=UnsuitableError();
        for (i=e.reasons.begin(); i!=e.reasons.end(); i++) {
            unicode = PyUnicode_FromString(*i);
error.reasons.append(boost::python::object(boost::python::handle<>(unicode)));
        }

        boost::python::object exc(error);
        PyErr_SetObject(UnsuitableErrorType, exc.ptr());
    }
}


void export() {
    object module(handle<>(borrowed(PyImport_AddModule("mypkg.article"))));
    scope().attr("article")=module;
    scope module_scope = module;

    class_<UnsuitableError> UnsuitableErrorClass("UnsuitableError");
UnsuitableErrorClass.def_readonly("reasons", &UnsuitableError::reasons);
    UnsuitableErrorType=UnsuitableErrorClass.ptr();

    register_exception_translator<unsuitable_error>(&translator);
}
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Reply via email to