bpo-45464: [doc] Explain that subclassing multiple exceptions is fragile (GH-29094)

Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com>
This commit is contained in:
Łukasz Langa 2021-10-20 18:54:31 +02:00 committed by GitHub
parent 1dfac27dff
commit dff0b71343
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 0 deletions

View File

@ -34,6 +34,10 @@ class or one of its subclasses, and not from :exc:`BaseException`. More
information on defining exceptions is available in the Python Tutorial under information on defining exceptions is available in the Python Tutorial under
:ref:`tut-userexceptions`. :ref:`tut-userexceptions`.
Exception context
-----------------
When raising (or re-raising) an exception in an :keyword:`except` or When raising (or re-raising) an exception in an :keyword:`except` or
:keyword:`finally` clause :keyword:`finally` clause
:attr:`__context__` is automatically set to the last exception caught; if the :attr:`__context__` is automatically set to the last exception caught; if the
@ -67,6 +71,25 @@ exceptions so that the final line of the traceback always shows the last
exception that was raised. exception that was raised.
Inheriting from built-in exceptions
-----------------------------------
User code can create subclasses that inherit from an exception type.
It's recommended to only subclass one exception type at a time to avoid
any possible conflicts between how the bases handle the ``args``
attribute, as well as due to possible memory layout incompatibilities.
.. impl-detail::
Most built-in exceptions are implemented in C for efficiency, see:
:source:`Objects/exceptions.c`. Some have custom memory layouts
which makes it impossible to create a subclass that inherits from
multiple exception types. The memory layout of a type is an implementation
detail and might change between Python versions, leading to new
conflicts in the future. Therefore, it's recommended to avoid
subclassing multiple exception types altogether.
Base classes Base classes
------------ ------------

View File

@ -0,0 +1,4 @@
Mention in the documentation of :ref:`Built-in Exceptions
<bltin-exceptions>` that inheriting from multiple exception types in a
single subclass is not recommended due to possible memory layout
incompatibility.