[PyQt] Raising C++ exceptions from python

Alessandro Pasotti apasotti at gmail.com
Mon Oct 13 11:48:33 BST 2014


2014-10-13 10:49 GMT+02:00 Phil Thompson <phil at riverbankcomputing.com>:
> On 13/10/2014 8:48 am, Alessandro Pasotti wrote:
>>
>> Hello,
>>
>> What is the recommended way to raise/throw a C++ exception from python
>> to be catched in C++ code?
>>
>> For example, I have this SIP code:
>>
>> class QgsMapServiceException
>> {
>> %TypeHeaderCode
>> #include <qgsmapserviceexception.h>
>> %End
>>   public:
>>     QgsMapServiceException( const QString& code, const QString& message );
>>     QString code() const;
>>     QString message() const;
>> };
>>
>>
>> In python code I would like to raise this exception and catch it from
>> C++ FCGI loop.
>>
>> The problem is that Python doesn't know that QgsMapServiceException is
>> an exception:
>>
>>     raise QgsMapServiceException('ExceptionFilter', 'Test exception
>> raised from ExceptionFilter')
>> TypeError: exceptions must be old-style classes or derived from
>> BaseException, not QgsMapServiceException
>
>
> http://pyqt.sourceforge.net/Docs/sip4/directives.html#directive-%Exception
>
> Phil

Hi Phil,

Thanks for pointing me to the right docs, I've now this SIP code but I
cannot catch anything from C++ loop, it seems like the exceptions are
silently ignored. I would like to raise exceptions from python and
catch them in C++.

Any idea about where to look?
Should I throw the exception from within RaiseCode ? (tried without success).



%Exception QgsMapServiceException(SIP_Exception) /PyName=QgsMapServiceException/
{
%TypeHeaderCode
#include <qgsmapserviceexception.h>
%End
%RaiseCode
  SIP_BLOCK_THREADS
  PyErr_SetString(sipException_QgsMapServiceException,
sipExceptionRef.message().toUtf8().constData() );
  SIP_UNBLOCK_THREADS
%End
};


-- 
Alessandro Pasotti
w3:   www.itopen.it


More information about the PyQt mailing list