.. _bltin-exceptions:

Built-in Exceptions
===================

.. index::
   pair: statement; try
   pair: statement; except

In Python, all exceptions must be instances of a class that derives from
:class:`BaseException`.  In a :keyword:`try` statement with an :keyword:`except`
clause that mentions a particular class, that clause also handles any exception
classes derived from that class (but not exception classes from which *it* is
derived).  Two exception classes that are not related via subclassing are never
equivalent, even if they have the same name.

.. index:: pair: statement; raise

The built-in exceptions listed in this chapter can be generated by the interpreter or
built-in functions.  Except where mentioned, they have an "associated value"
indicating the detailed cause of the error.  This may be a string or a tuple of
several items of information (e.g., an error code and a string explaining the
code).  The associated value is usually passed as arguments to the exception
class's constructor.

User code can raise built-in exceptions.  This can be used to test an exception
handler or to report an error condition "just like" the situation in which the
interpreter raises the same exception; but beware that there is nothing to
prevent user code from raising an inappropriate error.

The built-in exception classes can be subclassed to define new exceptions;
programmers are encouraged to derive new exceptions from the :exc:`Exception`
class or one of its subclasses, and not from :exc:`BaseException`.  More
information on defining exceptions is available in the Python Tutorial under
:ref:`tut-userexceptions`.


Exception context
-----------------

.. index:: pair: exception; chaining
           __cause__ (exception attribute)
           __context__ (exception attribute)
           __suppress_context__ (exception attribute)

Three attributes on exception objects provide information about the context in
which the exception was raised:

.. attribute:: BaseException.__context__
               BaseException.__cause__
               BaseException.__suppress_context__

   When raising a new exception while another exception
   is already being handled, the new exception's
   :attr:`!__context__` attribute is automatically set to the handled
   exception.  An exception may be handled when an :keyword:`except` or
   :keyword:`finally` clause, or a :keyword:`with` statement, is used.

   This implicit exception context can be
   supplemented with an explicit cause by using :keyword:`!from` with
   :keyword:`raise`::

      raise new_exc from original_exc

   The expression following :keyword:`from<raise>` must be an exception or ``None``. It
   will be set as :attr:`!__cause__` on the raised exception. Setting
   :attr:`!__cause__` also implicitly sets the :attr:`!__suppress_context__`
   attribute to ``True``, so that using ``raise new_exc from None``
   effectively replaces the old exception with the new one for display
   purposes (e.g. converting :exc:`KeyError` to :exc:`AttributeError`), while
   leaving the old exception available in :attr:`!__context__` for introspection
   when debugging.

   The default traceback display code shows these chained exceptions in
   addition to the traceback for the exception itself. An explicitly chained
   exception in :attr:`!__cause__` is always shown when present. An implicitly
   chained exception in :attr:`!__context__` is shown only if :attr:`!__cause__`
   is :const:`None` and :attr:`!__suppress_context__` is false.

   In either case, the exception itself is always shown after any chained
   exceptions so that the final line of the traceback always shows the last
   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
------------

The following exceptions are used mostly as base classes for other exceptions.

.. exception:: BaseException

   The base class for all built-in exceptions.  It is not meant to be directly
   inherited by user-defined classes (for that, use :exc:`Exception`).  If
   :func:`str` is called on an instance of this class, the representation of
   the argument(s) to the instance are returned, or the empty string when
   there were no arguments.

   .. attribute:: args

      The tuple of arguments given to the exception constructor.  Some built-in
      exceptions (like :exc:`OSError`) expect a certain number of arguments and
      assign a special meaning to the elements of this tuple, while others are
      usually called only with a single string giving an error message.

   .. method:: with_traceback(tb)

      This method sets *tb* as the new traceback for the exception and returns
      the exception object.  It was more commonly used before the exception
      chaining features of :pep:`3134` became available.  The following example
      shows how we can convert an instance of ``SomeException`` into an
      instance of ``OtherException`` while preserving the traceback.  Once
      raised, the current frame is pushed onto the traceback of the
      ``OtherException``, as would have happened to the traceback of the
      original ``SomeException`` had we allowed it to propagate to the caller. ::

         try:
             ...
         except SomeException:
             tb = sys.exception().__traceback__
             raise OtherException(...).with_traceback(tb)

   .. attribute:: __traceback__

      A writable field that holds the
      :ref:`traceback object <traceback-objects>` associated with this
      exception. See also: :ref:`raise`.

   .. method:: add_note(note)

      Add the string ``note`` to the exception's notes which appear in the standard
      traceback after the exception string. A :exc:`TypeError` is raised if ``note``
      is not a string.

      .. versionadded:: 3.11

   .. attribute:: __notes__

      A list of the notes of this exception, which were added with :meth:`add_note`.
      This attribute is created when :meth:`add_note` is called.

      .. versionadded:: 3.11


.. exception:: Exception

   All built-in, non-system-exiting exceptions are derived from this class.  All
   user-defined exceptions should also be derived from this class.


.. exception:: ArithmeticError

   The base class for those built-in exceptions that are raised for various
   arithmetic errors: :exc:`OverflowError`, :exc:`ZeroDivisionError`,
   :exc:`FloatingPointError`.


.. exception:: BufferError

   Raised when a :ref:`buffer <bufferobjects>` related operation cannot be
   performed.


.. exception:: LookupError

   The base class for the exceptions that are raised when a key or index used on
   a mapping or sequence is invalid: :exc:`IndexError`, :exc:`KeyError`.  This
   can be raised directly by :func:`codecs.lookup`.


Concrete exceptions
-------------------

The following exceptions are the exceptions that are usually raised.

.. exception:: AssertionError

   .. index:: pair: statement; assert

   Raised when an :keyword:`assert` statement fails.


.. exception:: AttributeError

   Raised when an attribute reference (see :ref:`attribute-references`) or
   assignment fails.  (When an object does not support attribute references or
   attribute assignments at all, :exc:`TypeError` is raised.)

   The optional *name* and *obj* keyword-only arguments
   set the corresponding attributes:

   .. attribute:: name

      The name of the attribute that was attempted to be accessed.

   .. attribute:: obj

      The object that was accessed for the named attribute.

   .. versionchanged:: 3.10
      Added the :attr:`name` and :attr:`obj` attributes.

.. exception:: EOFError

   Raised when the :func:`input` function hits an end-of-file condition (EOF)
   without reading any data. (Note: the :meth:`!io.IOBase.read` and
   :meth:`io.IOBase.readline` methods return an empty string when they hit EOF.)


.. exception:: FloatingPointError

   Not currently used.


.. exception:: GeneratorExit

   Raised when a :term:`generator` or :term:`coroutine` is closed;
   see :meth:`generator.close` and :meth:`coroutine.close`.  It
   directly inherits from :exc:`BaseException` instead of :exc:`Exception` since
   it is technically not an error.


.. exception:: ImportError

   Raised when the :keyword:`import` statement has troubles trying to
   load a module.  Also raised when the "from list" in ``from ... import``
   has a name that cannot be found.

   The optional *name* and *path* keyword-only arguments
   set the corresponding attributes:

   .. attribute:: name

      The name of the module that was attempted to be imported.

   .. attribute:: path

      The path to any file which triggered the exception.

   .. versionchanged:: 3.3
      Added the :attr:`name` and :attr:`path` attributes.

.. exception:: ModuleNotFoundError

   A subclass of :exc:`ImportError` which is raised by :keyword:`import`
   when a module could not be located.  It is also raised when ``None``
   is found in :data:`sys.modules`.

   .. versionadded:: 3.6


.. exception:: IndexError

   Raised when a sequence subscript is out of range.  (Slice indices are
   silently truncated to fall in the allowed range; if an index is not an
   integer, :exc:`TypeError` is raised.)

   .. XXX xref to sequences


.. exception:: KeyError

   Raised when a mapping (dictionary) key is not found in the set of existing keys.

   .. XXX xref to mapping objects?


.. exception:: KeyboardInterrupt

   Raised when the user hits the interrupt key (normally :kbd:`Control-C` or
   :kbd:`Delete`).  During execution, a check for interrupts is made
   regularly. The exception inherits from :exc:`BaseException` so as to not be
   accidentally caught by code that catches :exc:`Exception` and thus prevent
   the interpreter from exiting.

   .. note::

      Catching a :exc:`KeyboardInterrupt` requires special consideration.
      Because it can be raised at unpredictable points, it may, in some
      circumstances, leave the running program in an inconsistent state. It is
      generally best to allow :exc:`KeyboardInterrupt` to end the program as
      quickly as possible or avoid raising it entirely. (See
      :ref:`handlers-and-exceptions`.)


.. exception:: MemoryError

   Raised when an operation runs out of memory but the situation may still be
   rescued (by deleting some objects).  The associated value is a string indicating
   what kind of (internal) operation ran out of memory. Note that because of the
   underlying memory management architecture (C's :c:func:`malloc` function), the
   interpreter may not always be able to completely recover from this situation; it
   nevertheless raises an exception so that a stack traceback can be printed, in
   case a run-away program was the cause.


.. exception:: NameError

   Raised when a local or global name is not found.  This applies only to
   unqualified names.  The associated value is an error message that includes the
   name that could not be found.

   The optional *name* keyword-only argument sets the attribute:

   .. attribute:: name

      The name of the variable that was attempted to be accessed.

   .. versionchanged:: 3.10
      Added the :attr:`name` attribute.


.. exception:: NotImplementedError

   This exception is derived from :exc:`RuntimeError`.  In user defined base
   classes, abstract methods should raise this exception when they require
   derived classes to override the method, or while the class is being
   developed to indicate that the real implementation still needs to be added.

   .. note::

      It should not be used to indicate that an operator or method is not
      meant to be supported at all -- in that case either leave the operator /
      method undefined or, if a subclass, set it to :data:`None`.

   .. caution::

      :exc:`!NotImplementedError` and :data:`!NotImplemented` are not
      interchangeable. This exception should only be used as described
      above; see :data:`NotImplemented` for details on correct usage of
      the built-in constant.


.. exception:: OSError([arg])
               OSError(errno, strerror[, filename[, winerror[, filename2]]])

   .. index:: pair: module; errno

   This exception is raised when a system function returns a system-related
   error, including I/O failures such as "file not found" or "disk full"
   (not for illegal argument types or other incidental errors).

   The second form of the constructor sets the corresponding attributes,
   described below.  The attributes default to :const:`None` if not
   specified.  For backwards compatibility, if three arguments are passed,
   the :attr:`~BaseException.args` attribute contains only a 2-tuple
   of the first two constructor arguments.

   The constructor often actually returns a subclass of :exc:`OSError`, as
   described in `OS exceptions`_ below.  The particular subclass depends on
   the final :attr:`.errno` value.  This behaviour only occurs when
   constructing :exc:`OSError` directly or via an alias, and is not
   inherited when subclassing.

   .. attribute:: errno

      A numeric error code from the C variable :c:data:`errno`.

   .. attribute:: winerror

      Under Windows, this gives you the native
      Windows error code.  The :attr:`.errno` attribute is then an approximate
      translation, in POSIX terms, of that native error code.

      Under Windows, if the *winerror* constructor argument is an integer,
      the :attr:`.errno` attribute is determined from the Windows error code,
      and the *errno* argument is ignored.  On other platforms, the
      *winerror* argument is ignored, and the :attr:`winerror` attribute
      does not exist.

   .. attribute:: strerror

      The corresponding error message, as provided by
      the operating system.  It is formatted by the C
      functions :c:func:`!perror` under POSIX, and :c:func:`!FormatMessage`
      under Windows.

   .. attribute:: filename
                  filename2

      For exceptions that involve a file system path (such as :func:`open` or
      :func:`os.unlink`), :attr:`filename` is the file name passed to the function.
      For functions that involve two file system paths (such as
      :func:`os.rename`), :attr:`filename2` corresponds to the second
      file name passed to the function.


   .. versionchanged:: 3.3
      :exc:`EnvironmentError`, :exc:`IOError`, :exc:`WindowsError`,
      :exc:`socket.error`, :exc:`select.error` and
      :exc:`!mmap.error` have been merged into :exc:`OSError`, and the
      constructor may return a subclass.

   .. versionchanged:: 3.4
      The :attr:`filename` attribute is now the original file name passed to
      the function, instead of the name encoded to or decoded from the
      :term:`filesystem encoding and error handler`. Also, the *filename2*
      constructor argument and attribute was added.


.. exception:: OverflowError

   Raised when the result of an arithmetic operation is too large to be
   represented.  This cannot occur for integers (which would rather raise
   :exc:`MemoryError` than give up).  However, for historical reasons,
   OverflowError is sometimes raised for integers that are outside a required
   range.   Because of the lack of standardization of floating-point exception
   handling in C, most floating-point operations are not checked.


.. exception:: PythonFinalizationError

   This exception is derived from :exc:`RuntimeError`.  It is raised when
   an operation is blocked during interpreter shutdown also known as
   :term:`Python finalization <interpreter shutdown>`.

   Examples of operations which can be blocked with a
   :exc:`PythonFinalizationError` during the Python finalization:

   * Creating a new Python thread.
   * :meth:`Joining <threading.Thread.join>` a running daemon thread.
   * :func:`os.fork`,
   * acquiring a lock such as :class:`threading.Lock`, when it is known that
     the operation would otherwise deadlock.

   See also the :func:`sys.is_finalizing` function.

   .. versionadded:: 3.13
      Previously, a plain :exc:`RuntimeError` was raised.

   .. versionchanged:: 3.14

      :meth:`threading.Thread.join` can now raise this exception.

   .. versionchanged:: 3.15

      This exception may be raised when acquiring :meth:`threading.Lock`
      or :meth:`threading.RLock`.

.. exception:: RecursionError

   This exception is derived from :exc:`RuntimeError`.  It is raised when the
   interpreter detects that the maximum recursion depth (see
   :func:`sys.getrecursionlimit`) is exceeded.

   .. versionadded:: 3.5
      Previously, a plain :exc:`RuntimeError` was raised.


.. exception:: ReferenceError

   This exception is raised when a weak reference proxy, created by the
   :func:`weakref.proxy` function, is used to access an attribute of the referent
   after it has been garbage collected. For more information on weak references,
   see the :mod:`weakref` module.


.. exception:: RuntimeError

   Raised when an error is detected that doesn't fall in any of the other
   categories.  The associated value is a string indicating what precisely went
   wrong.


.. exception:: StopIteration

   Raised by built-in function :func:`next` and an :term:`iterator`\'s
   :meth:`~iterator.__next__` method to signal that there are no further
   items produced by the iterator.

   .. attribute:: StopIteration.value

      The exception object has a single attribute :attr:`!value`, which is
      given as an argument when constructing the exception, and defaults
      to :const:`None`.

   When a :term:`generator` or :term:`coroutine` function
   returns, a new :exc:`StopIteration` instance is
   raised, and the value returned by the function is used as the
   :attr:`value` parameter to the constructor of the exception.

   If a generator code directly or indirectly raises :exc:`StopIteration`,
   it is converted into a :exc:`RuntimeError` (retaining the
   :exc:`StopIteration` as the new exception's cause).

   .. versionchanged:: 3.3
      Added ``value`` attribute and the ability for generator functions to
      use it to return a value.

   .. versionchanged:: 3.5
      Introduced the RuntimeError transformation via
      ``from __future__ import generator_stop``, see :pep:`479`.

   .. versionchanged:: 3.7
      Enable :pep:`479` for all code by default: a :exc:`StopIteration`
      error raised in a generator is transformed into a :exc:`RuntimeError`.

.. exception:: StopAsyncIteration

   Must be raised by :meth:`~object.__anext__` method of an
   :term:`asynchronous iterator` object to stop the iteration.

   .. versionadded:: 3.5

.. exception:: SyntaxError(message, details)

   Raised when the parser encounters a syntax error.  This may occur in an
   :keyword:`import` statement, in a call to the built-in functions
   :func:`compile`, :func:`exec`,
   or :func:`eval`, or when reading the initial script or standard input
   (also interactively).

   The :func:`str` of the exception instance returns only the error message.
   Details is a tuple whose members are also available as separate attributes.

   .. attribute:: filename

      The name of the file the syntax error occurred in.

   .. attribute:: lineno

      Which line number in the file the error occurred in. This is
      1-indexed: the first line in the file has a ``lineno`` of 1.

   .. attribute:: offset

      The column in the line where the error occurred. This is
      1-indexed: the first character in the line has an ``offset`` of 1.

   .. attribute:: text

      The source code text involved in the error.

   .. attribute:: end_lineno

      Which line number in the file the error occurred ends in. This is
      1-indexed: the first line in the file has a ``lineno`` of 1.

   .. attribute:: end_offset

      The column in the end line where the error occurred finishes. This is
      1-indexed: the first character in the line has an ``offset`` of 1.

   For errors in f-string fields, the message is prefixed by "f-string: "
   and the offsets are offsets in a text constructed from the replacement
   expression.  For example, compiling f'Bad {a b} field' results in this
   args attribute: ('f-string: ...', ('', 1, 2, '(a b)\n', 1, 5)).

   .. versionchanged:: 3.10
      Added the :attr:`end_lineno` and :attr:`end_offset` attributes.

.. exception:: IndentationError

   Base class for syntax errors related to incorrect indentation.  This is a
   subclass of :exc:`SyntaxError`.


.. exception:: TabError

   Raised when indentation contains an inconsistent use of tabs and spaces.
   This is a subclass of :exc:`IndentationError`.


.. exception:: SystemError

   Raised when the interpreter finds an internal error, but the situation does not
   look so serious to cause it to abandon all hope. The associated value is a
   string indicating what went wrong (in low-level terms). In :term:`CPython`,
   this could be raised by incorrectly using Python's C API, such as returning
   a ``NULL`` value without an exception set.

   If you're confident that this exception wasn't your fault, or the fault of
   a package you're using, you should report this to the author or maintainer
   of your Python interpreter.
   Be sure to report the version of the Python interpreter (``sys.version``; it is
   also printed at the start of an interactive Python session), the exact error
   message (the exception's associated value) and if possible the source of the
   program that triggered the error.


.. exception:: SystemExit

   This exception is raised by the :func:`sys.exit` function.  It inherits from
   :exc:`BaseException` instead of :exc:`Exception` so that it is not accidentally
   caught by code that catches :exc:`Exception`.  This allows the exception to
   properly propagate up and cause the interpreter to exit.  When it is not
   handled, the Python interpreter exits; no stack traceback is printed.  The
   constructor accepts the same optional argument passed to :func:`sys.exit`.
   If the value is an integer, it specifies the system exit status (passed to
   C's :c:func:`!exit` function); if it is ``None``, the exit status is zero; if
   it has another type (such as a string), the object's value is printed and
   the exit status is one.

   A call to :func:`sys.exit` is translated into an exception so that clean-up
   handlers (:keyword:`finally` clauses of :keyword:`try` statements) can be
   executed, and so that a debugger can execute a script without running the risk
   of losing control.  The :func:`os._exit` function can be used if it is
   absolutely positively necessary to exit immediately (for example, in the child
   process after a call to :func:`os.fork`).

   .. attribute:: code

      The exit status or error message that is passed to the constructor.
      (Defaults to ``None``.)


.. exception:: TypeError

   Raised when an operation or function is applied to an object of inappropriate
   type.  The associated value is a string giving details about the type mismatch.

   This exception may be raised by user code to indicate that an attempted
   operation on an object is not supported, and is not meant to be. If an object
   is meant to support a given operation but has not yet provided an
   implementation, :exc:`NotImplementedError` is the proper exception to raise.

   Passing arguments of the wrong type (e.g. passing a :class:`list` when an
   :class:`int` is expected) should result in a :exc:`TypeError`, but passing
   arguments with the wrong value (e.g. a number outside expected boundaries)
   should result in a :exc:`ValueError`.

.. exception:: UnboundLocalError

   Raised when a reference is made to a local variable in a function or method, but
   no value has been bound to that variable.  This is a subclass of
   :exc:`NameError`.


.. exception:: UnicodeError

   Raised when a Unicode-related encoding or decoding error occurs.  It is a
   subclass of :exc:`ValueError`.

   :exc:`UnicodeError` has attributes that describe the encoding or decoding
   error.  For example, ``err.object[err.start:err.end]`` gives the particular
   invalid input that the codec failed on.

   .. attribute:: encoding

       The name of the encoding that raised the error.

   .. attribute:: reason

       A string describing the specific codec error.

   .. attribute:: object

       The object the codec was attempting to encode or decode.

   .. attribute:: start

       The first index of invalid data in :attr:`object`.

       This value should not be negative as it is interpreted as an
       absolute offset but this constraint is not enforced at runtime.

   .. attribute:: end

       The index after the last invalid data in :attr:`object`.

       This value should not be negative as it is interpreted as an
       absolute offset but this constraint is not enforced at runtime.


.. exception:: UnicodeEncodeError

   Raised when a Unicode-related error occurs during encoding.  It is a subclass of
   :exc:`UnicodeError`.


.. exception:: UnicodeDecodeError

   Raised when a Unicode-related error occurs during decoding.  It is a subclass of
   :exc:`UnicodeError`.


.. exception:: UnicodeTranslateError

   Raised when a Unicode-related error occurs during translating.  It is a subclass
   of :exc:`UnicodeError`.


.. exception:: ValueError

   Raised when an operation or function receives an argument that has the
   right type but an inappropriate value, and the situation is not described by a
   more precise exception such as :exc:`IndexError`.


.. exception:: ZeroDivisionError

   Raised when the second argument of a division or modulo operation is zero.  The
   associated value is a string indicating the type of the operands and the
   operation.


The following exceptions are kept for compatibility with previous versions;
starting from Python 3.3, they are aliases of :exc:`OSError`.

.. exception:: EnvironmentError

.. exception:: IOError

.. exception:: WindowsError

   Only available on Windows.


OS exceptions
^^^^^^^^^^^^^

The following exceptions are subclasses of :exc:`OSError`, they get raised
depending on the system error code.

.. exception:: BlockingIOError

   Raised when an operation would block on an object (e.g. socket) set
   for non-blocking operation.
   Corresponds to :c:data:`errno` :py:const:`~errno.EAGAIN`, :py:const:`~errno.EALREADY`,
   :py:const:`~errno.EWOULDBLOCK` and :py:const:`~errno.EINPROGRESS`.

   In addition to those of :exc:`OSError`, :exc:`BlockingIOError` can have
   one more attribute:

   .. attribute:: characters_written

      An integer containing the number of **bytes** written to the stream
      before it blocked. This attribute is available when using the
      buffered I/O classes from the :mod:`io` module.

.. exception:: ChildProcessError

   Raised when an operation on a child process failed.
   Corresponds to :c:data:`errno` :py:const:`~errno.ECHILD`.

.. exception:: ConnectionError

   A base class for connection-related issues.

   Subclasses are :exc:`BrokenPipeError`, :exc:`ConnectionAbortedError`,
   :exc:`ConnectionRefusedError` and :exc:`ConnectionResetError`.

.. exception:: BrokenPipeError

   A subclass of :exc:`ConnectionError`, raised when trying to write on a
   pipe while the other end has been closed, or trying to write on a socket
   which has been shutdown for writing.
   Corresponds to :c:data:`errno` :py:const:`~errno.EPIPE` and :py:const:`~errno.ESHUTDOWN`.

.. exception:: ConnectionAbortedError

   A subclass of :exc:`ConnectionError`, raised when a connection attempt
   is aborted by the peer.
   Corresponds to :c:data:`errno` :py:const:`~errno.ECONNABORTED`.

.. exception:: ConnectionRefusedError

   A subclass of :exc:`ConnectionError`, raised when a connection attempt
   is refused by the peer.
   Corresponds to :c:data:`errno` :py:const:`~errno.ECONNREFUSED`.

.. exception:: ConnectionResetError

   A subclass of :exc:`ConnectionError`, raised when a connection is
   reset by the peer.
   Corresponds to :c:data:`errno` :py:const:`~errno.ECONNRESET`.

.. exception:: FileExistsError

   Raised when trying to create a file or directory which already exists.
   Corresponds to :c:data:`errno` :py:const:`~errno.EEXIST`.

.. exception:: FileNotFoundError

   Raised when a file or directory is requested but doesn't exist.
   Corresponds to :c:data:`errno` :py:const:`~errno.ENOENT`.

.. exception:: InterruptedError

   Raised when a system call is interrupted by an incoming signal.
   Corresponds to :c:data:`errno` :py:const:`~errno.EINTR`.

   .. versionchanged:: 3.5
      Python now retries system calls when a syscall is interrupted by a
      signal, except if the signal handler raises an exception (see :pep:`475`
      for the rationale), instead of raising :exc:`InterruptedError`.

.. exception:: IsADirectoryError

   Raised when a file operation (such as :func:`os.remove`) is requested
   on a directory.
   Corresponds to :c:data:`errno` :py:const:`~errno.EISDIR`.

.. exception:: NotADirectoryError

   Raised when a directory operation (such as :func:`os.listdir`) is requested on
   something which is not a directory.  On most POSIX platforms, it may also be
   raised if an operation attempts to open or traverse a non-directory file as if
   it were a directory.
   Corresponds to :c:data:`errno` :py:const:`~errno.ENOTDIR`.

.. exception:: PermissionError

   Raised when trying to run an operation without the adequate access
   rights - for example filesystem permissions.
   Corresponds to :c:data:`errno` :py:const:`~errno.EACCES`,
   :py:const:`~errno.EPERM`, and :py:const:`~errno.ENOTCAPABLE`.

   .. versionchanged:: 3.11.1
      WASI's :py:const:`~errno.ENOTCAPABLE` is now mapped to
      :exc:`PermissionError`.

.. exception:: ProcessLookupError

   Raised when a given process doesn't exist.
   Corresponds to :c:data:`errno` :py:const:`~errno.ESRCH`.

.. exception:: TimeoutError

   Raised when a system function timed out at the system level.
   Corresponds to :c:data:`errno` :py:const:`~errno.ETIMEDOUT`.

.. versionadded:: 3.3
   All the above :exc:`OSError` subclasses were added.


.. seealso::

   :pep:`3151` - Reworking the OS and IO exception hierarchy


.. _warning-categories-as-exceptions:

Warnings
--------

The following exceptions are used as warning categories; see the
:ref:`warning-categories` documentation for more details.

.. exception:: Warning

   Base class for warning categories.


.. exception:: UserWarning

   Base class for warnings generated by user code.


.. exception:: DeprecationWarning

   Base class for warnings about deprecated features when those warnings are
   intended for other Python developers.

   Ignored by the default warning filters, except in the ``__main__`` module
   (:pep:`565`). Enabling the :ref:`Python Development Mode <devmode>` shows
   this warning.

   The deprecation policy is described in :pep:`387`.


.. exception:: PendingDeprecationWarning

   Base class for warnings about features which are obsolete and
   expected to be deprecated in the future, but are not deprecated
   at the moment.

   This class is rarely used as emitting a warning about a possible
   upcoming deprecation is unusual, and :exc:`DeprecationWarning`
   is preferred for already active deprecations.

   Ignored by the default warning filters. Enabling the :ref:`Python
   Development Mode <devmode>` shows this warning.

   The deprecation policy is described in :pep:`387`.


.. exception:: SyntaxWarning

   Base class for warnings about dubious syntax.

   This warning is typically emitted when compiling Python source code, and usually won't be reported
   when running already compiled code.


.. exception:: RuntimeWarning

   Base class for warnings about dubious runtime behavior.


.. exception:: FutureWarning

   Base class for warnings about deprecated features when those warnings are
   intended for end users of applications that are written in Python.


.. exception:: ImportWarning

   Base class for warnings about probable mistakes in module imports.

   Ignored by the default warning filters. Enabling the :ref:`Python
   Development Mode <devmode>` shows this warning.


.. exception:: UnicodeWarning

   Base class for warnings related to Unicode.


.. exception:: EncodingWarning

   Base class for warnings related to encodings.

   See :ref:`io-encoding-warning` for details.

   .. versionadded:: 3.10


.. exception:: BytesWarning

   Base class for warnings related to :class:`bytes` and :class:`bytearray`.


.. exception:: ResourceWarning

   Base class for warnings related to resource usage.

   Ignored by the default warning filters. Enabling the :ref:`Python
   Development Mode <devmode>` shows this warning.

   .. versionadded:: 3.2


.. _lib-exception-groups:

Exception groups
----------------

The following are used when it is necessary to raise multiple unrelated
exceptions. They are part of the exception hierarchy so they can be
handled with :keyword:`except` like all other exceptions. In addition,
they are recognised by :keyword:`except*<except_star>`, which matches
their subgroups based on the types of the contained exceptions.

.. exception:: ExceptionGroup(msg, excs)
.. exception:: BaseExceptionGroup(msg, excs)

   Both of these exception types wrap the exceptions in the sequence ``excs``.
   The ``msg`` parameter must be a string. The difference between the two
   classes is that :exc:`BaseExceptionGroup` extends :exc:`BaseException` and
   it can wrap any exception, while :exc:`ExceptionGroup` extends :exc:`Exception`
   and it can only wrap subclasses of :exc:`Exception`. This design is so that
   ``except Exception`` catches an :exc:`ExceptionGroup` but not
   :exc:`BaseExceptionGroup`.

   The :exc:`BaseExceptionGroup` constructor returns an :exc:`ExceptionGroup`
   rather than a :exc:`BaseExceptionGroup` if all contained exceptions are
   :exc:`Exception` instances, so it can be used to make the selection
   automatic. The :exc:`ExceptionGroup` constructor, on the other hand,
   raises a :exc:`TypeError` if any contained exception is not an
   :exc:`Exception` subclass.

   .. impl-detail::

      The ``excs`` parameter may be any sequence, but lists and tuples are
      specifically processed more efficiently here. For optimal performance,
      pass a tuple as ``excs``.

   .. attribute:: message

       The ``msg`` argument to the constructor. This is a read-only attribute.

   .. attribute:: exceptions

       A tuple of the exceptions in the ``excs`` sequence given to the
       constructor. This is a read-only attribute.

   .. method:: subgroup(condition)

      Returns an exception group that contains only the exceptions from the
      current group that match *condition*, or ``None`` if the result is empty.

      The condition can be an exception type or tuple of exception types, in which
      case each exception is checked for a match using the same check that is used
      in an ``except`` clause.  The condition can also be a callable (other than
      a type object) that accepts an exception as its single argument and returns
      true for the exceptions that should be in the subgroup.

      The nesting structure of the current exception is preserved in the result,
      as are the values of its :attr:`message`,
      :attr:`~BaseException.__traceback__`, :attr:`~BaseException.__cause__`,
      :attr:`~BaseException.__context__` and
      :attr:`~BaseException.__notes__` fields.
      Empty nested groups are omitted from the result.

      The condition is checked for all exceptions in the nested exception group,
      including the top-level and any nested exception groups. If the condition is
      true for such an exception group, it is included in the result in full.

      .. versionadded:: 3.13
         ``condition`` can be any callable which is not a type object.

   .. method:: split(condition)

      Like :meth:`subgroup`, but returns the pair ``(match, rest)`` where ``match``
      is ``subgroup(condition)`` and ``rest`` is the remaining non-matching
      part.

   .. method:: derive(excs)

      Returns an exception group with the same :attr:`message`, but which
      wraps the exceptions in ``excs``.

      This method is used by :meth:`subgroup` and :meth:`split`, which
      are used in various contexts to break up an exception group. A
      subclass needs to override it in order to make :meth:`subgroup`
      and :meth:`split` return instances of the subclass rather
      than :exc:`ExceptionGroup`.

      :meth:`subgroup` and :meth:`split` copy the
      :attr:`~BaseException.__traceback__`,
      :attr:`~BaseException.__cause__`, :attr:`~BaseException.__context__` and
      :attr:`~BaseException.__notes__` fields from
      the original exception group to the one returned by :meth:`derive`, so
      these fields do not need to be updated by :meth:`derive`.

      .. doctest::

         >>> class MyGroup(ExceptionGroup):
         ...     def derive(self, excs):
         ...         return MyGroup(self.message, excs)
         ...
         >>> e = MyGroup("eg", [ValueError(1), TypeError(2)])
         >>> e.add_note("a note")
         >>> e.__context__ = Exception("context")
         >>> e.__cause__ = Exception("cause")
         >>> try:
         ...    raise e
         ... except Exception as e:
         ...    exc = e
         ...
         >>> match, rest = exc.split(ValueError)
         >>> exc, exc.__context__, exc.__cause__, exc.__notes__
         (MyGroup('eg', [ValueError(1), TypeError(2)]), Exception('context'), Exception('cause'), ['a note'])
         >>> match, match.__context__, match.__cause__, match.__notes__
         (MyGroup('eg', [ValueError(1)]), Exception('context'), Exception('cause'), ['a note'])
         >>> rest, rest.__context__, rest.__cause__, rest.__notes__
         (MyGroup('eg', [TypeError(2)]), Exception('context'), Exception('cause'), ['a note'])
         >>> exc.__traceback__ is match.__traceback__ is rest.__traceback__
         True


   Note that :exc:`BaseExceptionGroup` defines :meth:`~object.__new__`, so
   subclasses that need a different constructor signature need to
   override that rather than :meth:`~object.__init__`. For example, the following
   defines an exception group subclass which accepts an exit_code and
   constructs the group's message from it. ::

      class Errors(ExceptionGroup):
         def __new__(cls, errors, exit_code):
            self = super().__new__(Errors, f"exit code: {exit_code}", errors)
            self.exit_code = exit_code
            return self

         def derive(self, excs):
            return Errors(excs, self.exit_code)

   Like :exc:`ExceptionGroup`, any subclass of :exc:`BaseExceptionGroup` which
   is also a subclass of :exc:`Exception` can only wrap instances of
   :exc:`Exception`.

   .. versionadded:: 3.11


Exception hierarchy
-------------------

The class hierarchy for built-in exceptions is:

.. literalinclude:: ../../Lib/test/exception_hierarchy.txt
  :language: text
