[PyQt] Re: Python frame never dies on application errors
Sundance
sundance at ierne.eu.org
Wed Dec 10 11:26:18 GMT 2008
Fabio Menegazzo wrote:
> Consider a widget in the display. When an exception happens the Python
> frame never dies. Am I doing something wrong?
Hi Fabio,
In your example, your exception occurs while the frame for
SlotRaiseError() is still on the stack. The traceback thus keeps a
pointer to that frame, which is why the stub variable's refcount doesn't
reach 0. You are trying to use sys.exc_clear(), but that function makes
strictly no promise as to what variables are going to get cleared, or
when (see http://effbot.org/pyref/sys.exc_clear.htm). In particular, it
doesn't clear the reference to the last traceback that is available in
the sys module.
Contrast the example:
---[ Example ]---------------------------------------------------------
import sys
from PyQt4 import Qt
class Stub:
def __init__( s ):
print "I'm a stub instance and I was just created!"
def __del__( s ):
print "Whoops, my refcount is zero and now I die!"
class TestClass:
def causeHavoc( s ):
stub = Stub()
raise Exception( "Whoops, an error occurred!" )
def clearTraceback( s ):
print "Deleting last traceback..."
sys.last_traceback = None ## HERE!
def start( s ):
app = Qt.QApplication( sys.argv )
Qt.QTimer.singleShot( 1000, s.causeHavoc )
Qt.QTimer.singleShot( 2000, s.clearTraceback )
Qt.QTimer.singleShot( 3000, app.quit )
app.exec_()
t = TestClass()
t.start()
-----------------------------------------------------------------------
In this example, the stub variable is correctly collected when the
reference to the traceback is deleted.
In short: business as usual. Python works fine, it just keeps a
reference to the last traceback that you didn't know about. :)
Hope this helps,
-- S.
More information about the PyQt
mailing list