[PyQt] Problem with exception translation

Hans Meine meine at informatik.uni-hamburg.de
Thu Sep 9 14:59:04 BST 2010


Hi,

I have had many problems with exception translation.  First of all, it seems 
to be an undocumented fact that the exception translation is overwritten by 
%MethodCode blocks (i.e. not wrapped around them).

Second, even after enabling exception translation by passing -e and describing 
my exception (or std::exception, which is the base class) using an %Exception 
block, it is not caught anywhere, obviously because I have no throw(...) 
clauses.  (Luckily, I later found /Default/, see below.)

Third, I have had problems when trying to add throw(...) clauses, i.e. I have
  
  class Foo : QObject
  {
    void test() throw (std::exception);
  };

  %Exception std::exception(SIP_Exception)
  {
  %TypeHeaderCode
  #include <exception>
  %End

  %RaiseCode
    const char *detail = sipExceptionRef.what();

    SIP_BLOCK_THREADS
    PyErr_SetString(PyExc_RuntimeError, detail);
    SIP_UNBLOCK_THREADS
  %End
  };

But I am getting:
sip: ..:14: There is already a class or namespace in scope with the same 
Python name

Ah!  The error goes away when I swap the two declarations, i.e. move the 
%Exception block above.

Anyhow, now I found the /Default/ annotation, which is exactly what I want.  
However, I get compile errors from the generated code; obviously, the above 
%TypeHeaderCode is not inserted into every file using the above default-catch 
block, so #include <exception> is missing and the build fails.

At least the latter seems to be a clear bug to me, no?

Have a nice day,
  Hans


More information about the PyQt mailing list