[PyQt] Custom exception when transferring "owned" object
Nyall Dawson
nyall.dawson at gmail.com
Fri Mar 29 06:32:07 GMT 2019
Hi list,
I'm trying to find a way to raise a custom exception if someone
attempts to call a method which takes ownership with an object which
is already owned elsewhere (instead of crashing at some future
stage!).
Here's what I've got so far:
.h:
bool addGeometry( QgsAbstractGeometry *g );
.sip:
%MethodCode
PyObject *obj = sipConvertFromType( a0, sipType_QgsAbstractGeometry, NULL );
if ( !sipIsPyOwned( ( sipSimpleWrapper * )obj ) )
{
PyErr_SetString( sipException_OwnershipException, "Geometry is
already owned by another c++ object. Use .clone() to add a deep copy
of the geometry to this multipoint." );
sipIsErr = 1;
Py_DECREF( obj );
}
else
{
bool res = sipCpp->addGeometry( a0 );
if ( res )
{
PyObject *owner = sipConvertFromType( sipCpp,
sipType_QgsAbstractGeometry, NULL );
sipTransferTo( obj, owner );
}
return PyBool_FromLong( res );
}
%End
It works ok about 50% of the time, the other 50% it crashes. I suspect
my methodcode isn't correct transferring ownership and the argument
c++ object is getting deleted when its Python wrapper goes out of
scope.
Can anyone see what I'm missing here?
Nyall
More information about the PyQt
mailing list