diff options
author | Victor Stinner <vstinner@redhat.com> | 2019-06-14 16:03:22 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-14 16:03:22 (GMT) |
commit | 212646cae6b7c4ddc8d98c8b9b6d39a5f259e864 (patch) | |
tree | bb98370389d304b2b835efd3791fcbbab07bb320 /Lib/test/support | |
parent | 9765efcb39fc03d5b1abec3924388974470a8bd5 (diff) | |
download | cpython-212646cae6b7c4ddc8d98c8b9b6d39a5f259e864.zip cpython-212646cae6b7c4ddc8d98c8b9b6d39a5f259e864.tar.gz cpython-212646cae6b7c4ddc8d98c8b9b6d39a5f259e864.tar.bz2 |
bpo-37261: Document sys.unraisablehook corner cases (GH-14059)
Document reference cycle and resurrected objects issues in
sys.unraisablehook() and threading.excepthook() documentation.
Fix test.support.catch_unraisable_exception(): __exit__() no longer
ignores unraisable exceptions.
Fix test_io test_writer_close_error_on_close(): use a second
catch_unraisable_exception() to catch the BufferedWriter unraisable
exception.
Diffstat (limited to 'Lib/test/support')
-rw-r--r-- | Lib/test/support/__init__.py | 15 |
1 files changed, 3 insertions, 12 deletions
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 174e045..7c0efc7 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -3040,17 +3040,13 @@ class catch_unraisable_exception: """ Context manager catching unraisable exception using sys.unraisablehook. - If the *object* attribute of the unraisable hook is set and the object is - being finalized, the object is resurrected because the context manager - stores a strong reference to it (cm.unraisable.object). - Storing the exception value (cm.unraisable.exc_value) creates a reference cycle. The reference cycle is broken explicitly when the context manager exits. - Exiting the context manager clears the stored unraisable exception. It can - trigger a new unraisable exception (ex: the resurrected object is finalized - again and raises the same exception): it is silently ignored in this case. + Storing the object (cm.unraisable.object) can resurrect it if it is set to + an object which is being finalized. Exiting the context manager clears the + stored object. Usage: @@ -3080,10 +3076,5 @@ class catch_unraisable_exception: return self def __exit__(self, *exc_info): - # Clear the unraisable exception to explicitly break a reference cycle. - # It can call _hook() again: ignore the new unraisable exception in - # this case. - self.unraisable = None - sys.unraisablehook = self._old_hook del self.unraisable |