]> granicus.if.org Git - python/commitdiff
bpo-37826: Document exception chaining in Python tutorial for errors. (GH-15243)
authorAbhilash Raj <maxking@users.noreply.github.com>
Wed, 14 Aug 2019 21:11:32 +0000 (14:11 -0700)
committerMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 14 Aug 2019 21:11:32 +0000 (14:11 -0700)
https://bugs.python.org/issue37826

Doc/tutorial/errors.rst

index 4e287bbd8d29ff45adcf6e2404047798d4928f71..e9a63e425279c340705603ea7671f3ed0493275c 100644 (file)
@@ -267,6 +267,53 @@ re-raise the exception::
    NameError: HiThere
 
 
+.. _tut-exception-chaining:
+
+Exception Chaining
+==================
+
+The :keyword:`raise` statement allows an optional :keyword:`from` which enables
+chaining exceptions by setting the ``__cause__`` attribute of the raised
+exception. For example::
+
+    raise RuntimeError from OSError
+
+This can be useful when you are transforming exceptions. For example::
+
+    >>> def func():
+    ...    raise IOError
+    ...
+    >>> try:
+    ...     func()
+    ... except IOError as exc:
+    ...     raise RuntimeError('Failed to open database') from exc
+    ...
+    Traceback (most recent call last):
+      File "<stdin>", line 2, in <module>
+      File "<stdin>", line 2, in func
+    OSError
+    <BLANKLINE>
+    The above exception was the direct cause of the following exception:
+    <BLANKLINE>
+    Traceback (most recent call last):
+      File "<stdin>", line 4, in <module>
+    RuntimeError
+
+The expression following the :keyword:`from` must be either an exception or
+``None``. Exception chaining happens automatically when an exception is raised
+inside an exception handler or :keyword:`finally` section. Exception chaining
+can be disabled by using ``from None`` idiom:
+
+    >>> try:
+    ...     open('database.sqlite')
+    ... except IOError:
+    ...     raise RuntimeError from None
+    ...
+    Traceback (most recent call last):
+      File "<stdin>", line 4, in <module>
+    RuntimeError
+
+
 .. _tut-userexceptions:
 
 User-defined Exceptions