> On Mon, 6 Jun 2005 17:54:43 +0100
> Phil Thompson <[EMAIL PROTECTED]> wrote:
>
>> SIP's exception support was added by a user - I've never used it myself.
>> Suggestions for improvements always welcome.
>
> I see the following scenario.  User creates exception class and expose
> it in module namespace (Please correct me if there is a better way):
>
> %ModuleCode
> static PyObject *MyException_object;
> %End
>
> %PostInitialisationCode
>     MyException_object = PyErr_NewException("MyModule.MyException", 0, 0);
>     if (!MyException_object) return;
>     PyDict_SetItemString(sip_mdict, "MyException", MyException_object);
> %End
>
> Then he has to define one way mapping for it (assuming MyException has
> the same interface as std::exception):
>
> %MappedType MyException
> {
>
> %ConvertFromTypeCode
>     return PyObject_CallFunction(MyException_object, "S", sipCpp->what());
> %End
>
> %ConvertToTypeCode
>     // We don't need backward convertion, but SIP requires it.
>     *sipIsErr = 1;
>     return 0;
> %End
>
> };

So if I introduce something like...

%ExceptionType MyException
%TypeHeaderCode
#include <whatever>
%End
%ConvertFromTypeCode
    // C++ code to return a PyObject instance of the exception.
    // sipCpp (the C++ poiter) and sipException_MyException (the
    // PyObject exception type) will be available, eg...
    return PyObject_CallFunction(sipException_MyException, "S",
                                 sipCpp->what());
%End
%End

...that has the same effect as your code above.

> That's all.  Now generated code for method with signature
> "void error() throw (MyException);" should be equivalent to
> something like the following:
>
>     try
>     {
>     sipCpp -> Test::error();
>     }
>     catch (MyException &e)
>     {
>             PyObject *MyException_instance = ... // %ConvertFromTypeCode
>             PyObject *MyException_object =
> PyObject_Type(MyException_instance);
>             PyErr_SetObject(MyException_object, MyException_instance);
>             return NULL;
>     }

...and generate the above code automatically, then that gives you what you
want? If MyException isn't defined then it reverts to the current
behaviour.

Phil

_______________________________________________
PyKDE mailing list    PyKDE@mats.imk.fraunhofer.de
http://mats.imk.fraunhofer.de/mailman/listinfo/pykde

Reply via email to