This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author vstinner
Recipients rbcollins, vstinner
Date 2015-03-05.02:33:27
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1425522808.88.0.474702563408.issue23587@psf.upfronthosting.co.za>
In-reply-to
Content
In Python 3, an exception contains a traceback. A traceback contains frames which contain local variables. Sometimes, the newly raised exception is a local variable and so we get a reference cycle: exc -> traceback -> frame -> exc...

In asyncio, it's a real issue because exception objects are kept alive longer than an except block. They are stored in Future objects by Future.set_exception() (and so Task.set_exception()).

Python 3.5 has a new traceback.TracebackException (see issue #17911) which creates a light "view" which can be used to format a traceback and the view doesn't contain local variables.

It would be great if we can use it.

The problem is to that Future.result() raises the exception set in Future.set_exception(), and we except to get the traceback of the exception.

So it's unclear to me how long we must store the exception.

Maybe we can only store a traceback.TracebackException in release mode and store the full traceback object in debug mode? Such change means that enabling the debug mode may create reference cycles (compared to the new release mode), which can be very suprising and annoying.
History
Date User Action Args
2015-03-05 02:33:28vstinnersetrecipients: + vstinner, rbcollins
2015-03-05 02:33:28vstinnersetmessageid: <1425522808.88.0.474702563408.issue23587@psf.upfronthosting.co.za>
2015-03-05 02:33:28vstinnerlinkissue23587 messages
2015-03-05 02:33:27vstinnercreate