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.
(cherry picked from commit 212646cae6b7c4ddc8d98c8b9b6d39a5f259e864)
Co-authored-by: Victor Stinner <vstinner@redhat.com>
diff --git a/Doc/library/test.rst b/Doc/library/test.rst
index 0a98c88..920c018 100644
--- a/Doc/library/test.rst
+++ b/Doc/library/test.rst
@@ -1086,17 +1086,13 @@
Context manager catching unraisable exception using
:func:`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::