[PyQt] Raising C++ exceptions from python
Phil Thompson
phil at riverbankcomputing.com
Mon Oct 13 12:51:22 BST 2014
On 13/10/2014 11:48 am, Alessandro Pasotti wrote:
> 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
> };
You might need...
http://pyqt.sourceforge.net/Docs/sip4/directives.html#directive-%VirtualErrorHandler
Phil
More information about the PyQt
mailing list