diff options
author | Georg Brandl <georg@python.org> | 2008-07-19 15:51:07 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2008-07-19 15:51:07 (GMT) |
commit | 1aea30aa853759eb9be591ec05e5c809e3aab6a4 (patch) | |
tree | 89db6e9188f2dc1fe42f8514f4aa7aae7cf25990 /Doc/reference/simple_stmts.rst | |
parent | 0f6de936f81eeb292542aa91a7dfd3fbaf887066 (diff) | |
download | cpython-1aea30aa853759eb9be591ec05e5c809e3aab6a4.zip cpython-1aea30aa853759eb9be591ec05e5c809e3aab6a4.tar.gz cpython-1aea30aa853759eb9be591ec05e5c809e3aab6a4.tar.bz2 |
#3113: document exception chaining.
Diffstat (limited to 'Doc/reference/simple_stmts.rst')
-rw-r--r-- | Doc/reference/simple_stmts.rst | 47 |
1 files changed, 44 insertions, 3 deletions
diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index 2f9db9d..e4c0192 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -476,6 +476,7 @@ The :keyword:`raise` statement statement: raise single: exception pair: raising; exception + single: __traceback__ (exception attribute) .. productionlist:: raise_stmt: "raise" [`expression` ["from" `expression`]] @@ -503,9 +504,49 @@ instance, with its traceback set to its argument), like so:: raise RuntimeError("foo occurred").with_traceback(tracebackobj) -.. XXX document exception chaining - -The "from" clause is used for exception chaining, which is not documented yet. +.. index:: pair: exception; chaining + __cause__ (exception attribute) + __context__ (exception attribute) + +The ``from`` clause is used for exception chaining: if given, the second +*expression* must be another exception class or instance, which will then be +attached to the raised exception as the :attr:`__cause__` attribute (which is +writable). If the raised exception is not handled, both exceptions will be +printed:: + + >>> try: + ... print(1 / 0) + ... except Exception as exc: + ... raise RuntimeError("Something bad happened") from exc + ... + Traceback (most recent call last): + File "<stdin>", line 2, in <module> + ZeroDivisionError: int division or modulo by zero + + The above exception was the direct cause of the following exception: + + Traceback (most recent call last): + File "<stdin>", line 4, in <module> + RuntimeError: Something bad happened + +A similar mechanism works implicitly if an exception is raised inside an +exception handler: the previous exception is then attached as the new +exception's :attr:`__context__` attribute:: + + >>> try: + ... print(1 / 0) + ... except: + ... raise RuntimeError("Something bad happened") + ... + Traceback (most recent call last): + File "<stdin>", line 2, in <module> + ZeroDivisionError: int division or modulo by zero + + During handling of the above exception, another exception occurred: + + Traceback (most recent call last): + File "<stdin>", line 4, in <module> + RuntimeError: Something bad happened Additional information on exceptions can be found in section :ref:`exceptions`, and information about handling exceptions is in section :ref:`try`. |