gh-119786: move a few more details on exception handling from devguide to InternalDocs (#124989)

This commit is contained in:
Irit Katriel 2024-10-05 00:48:12 +01:00 committed by GitHub
parent f474391b26
commit 8bcf118dcb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 11 additions and 1 deletions

View File

@ -75,7 +75,8 @@ table. If it finds a handler, control flow transfers to it. Otherwise, the
exception bubbles up to the caller, and the caller's frame is exception bubbles up to the caller, and the caller's frame is
checked for a handler covering the `CALL` instruction. This checked for a handler covering the `CALL` instruction. This
repeats until a handler is found or the topmost frame is reached. repeats until a handler is found or the topmost frame is reached.
If no handler is found, the program terminates. During unwinding, If no handler is found, then the interpreter function
(``_PyEval_EvalFrameDefault()``) returns NULL. During unwinding,
the traceback is constructed as each frame is added to it by the traceback is constructed as each frame is added to it by
``PyTraceBack_Here()``, which is in ``PyTraceBack_Here()``, which is in
[Python/traceback.c](https://github.com/python/cpython/blob/main/Python/traceback.c). [Python/traceback.c](https://github.com/python/cpython/blob/main/Python/traceback.c).
@ -182,3 +183,12 @@ The interpreter's function to lookup the table by instruction offset is
The Python function ``_parse_exception_table()`` in The Python function ``_parse_exception_table()`` in
[Lib/dis.py](https://github.com/python/cpython/blob/main/Lib/dis.py) [Lib/dis.py](https://github.com/python/cpython/blob/main/Lib/dis.py)
returns the exception table content as a list of namedtuple instances. returns the exception table content as a list of namedtuple instances.
Exception Chaining Implementation
---------------------------------
[Exception chaining](https://docs.python.org/dev/tutorial/errors.html#exception-chaining)
refers to setting the ``__context__`` and ``__cause__`` fields of an exception as it is
being raised. The ``__context__`` field is set by ``_PyErr_SetObject()`` in
:cpy-file:`Python/errors.c` (which is ultimately called by all ``PyErr_Set*()`` functions).
The ``__cause__`` field (explicit chaining) is set by the ``RAISE_VARARGS`` bytecode.