[PyQt] unable to retrieve python exception type objects (C api)

Samuel DEBIONNE samuel.debionne at esrf.fr
Wed Mar 7 13:02:47 GMT 2018


Hi,

Sorry to reopen this old thread, I just wanted to let you know that this 
bug is still in 4.19.8. The issue is with SIP file that defines an 
exception and is shared between a couple of different modules.

Thanks,

Sam

On 21 Apr 2017, at 1:13 pm, Philip Scott wrote:

 > Hi Folks,
 > > According to the documentation online: SIP generates a Python 
object > for each exception defined with the %Exception directive. > > 
These objects are named with the fully qualified exception name (i.e. > 
including any enclosing scope) prefixed by sipException_. For > example, 
the type object for enum Except defined in class Klass > 
issipException_Klass_Except. > > The objects of all imported exceptions 
are available to handwritten > code. > > This worked for us well in 
4.17. I am trying to upgrade to 4.19 and > came across a problem. In 
4.19, for a SIP module called say, 'foo,' > there is an #define in 
sipAPIfoo.h of the form > > #define sipException_my_exception 
sipExportedExceptions_foo[0] > > However, the array 
sipExportedExceptions_foo is defined in > 'sipfoocmodule.cpp' but not 
declared in any header file. > > I managed to work around this in one 
module by simply declaring it > before my handwritten C code: > > extern 
PyObject *sipExportedExceptions_foo[3]; > > But unfortunately got 
completely stuck when I came a cross a SIP file > that was shared 
between a couple of different modules as the name of > the module it was 
going to be used in could not be known. The code > looks a bit like this 
(I believe it was also taken from the PyQt > example documentation 
somewhere): > > %Exception std::exception(SIP_Exception) 
/PyName=StdException/ { > %TypeHeaderCode #include <exception> %End 
%RaiseCode const char* what > = sipExceptionRef.what(); 
SIP_BLOCK_THREADS > PyErr_SetString(sipException_std_exception, what); > 
SIP_UNBLOCK_THREADS %End }; > > I wonder if this is related to the 
incompatibility notes from the > 4.19 release: > > Starting with this 
version only those type structures needed by the > generated code are 
automatically available to handwritten code > possibly resulting in 
compiler errors. Handwritten code should be > changed to call 
sipFindType() to obtain a pointer to the required > type structure. > > 
I did try using sipFindType to find my exception type but with no > 
success, and looking at the generated code I can't see anywhere that > 
the exceptions are registered in any way except in the python module > 
dictionary. > > Apologies if this question has been asked already - I 
did do a quick > ctrl+f of the post titles to the mailing list; I 
couldn't find a > better way to search. I've been googling for a solid 
day, I can't > believe this hasn't affected anyone else - perhaps our 
usage is > non-standard in some way? > > Anyhow, any pointers would be 
greatly appreciated.




More information about the PyQt mailing list