.. highlightlang:: c


.. _exceptionhandling:

******************
Exception Handling
******************

The functions described in this chapter will let you handle and raise Python
exceptions.  It is important to understand some of the basics of Python
exception handling.  It works somewhat like the Unix :cdata:`errno` variable:
there is a global indicator (per thread) of the last error that occurred.  Most
functions don't clear this on success, but will set it to indicate the cause of
the error on failure.  Most functions also return an error indicator, usually
*NULL* if they are supposed to return a pointer, or ``-1`` if they return an
integer (exception: the :cfunc:`PyArg_\*` functions return ``1`` for success and
``0`` for failure).

When a function must fail because some function it called failed, it generally
doesn't set the error indicator; the function it called already set it.  It is
responsible for either handling the error and clearing the exception or
returning after cleaning up any resources it holds (such as object references or
memory allocations); it should *not* continue normally if it is not prepared to
handle the error.  If returning due to an error, it is important to indicate to
the caller that an error has been set.  If the error is not handled or carefully
propagated, additional calls into the Python/C API may not behave as intended
and may fail in mysterious ways.

The error indicator consists of three Python objects corresponding to the result
of ``sys.exc_info()``.  API functions exist to interact with the error indicator
in various ways.  There is a separate error indicator for each thread.

.. XXX Order of these should be more thoughtful.
   Either alphabetical or some kind of structure.


.. cfunction:: void PyErr_PrintEx(int set_sys_last_vars)

   Print a standard traceback to ``sys.stderr`` and clear the error indicator.
   Call this function only when the error indicator is set.  (Otherwise it will
   cause a fatal error!)

   If *set_sys_last_vars* is nonzero, the variables :data:`sys.last_type`,
   :data:`sys.last_value` and :data:`sys.last_traceback` will be set to the
   type, value and traceback of the printed exception, respectively.


.. cfunction:: void PyErr_Print()

   Alias for ``PyErr_PrintEx(1)``.


.. cfunction:: PyObject* PyErr_Occurred()

   Test whether the error indicator is set.  If set, return the exception *type*
   (the first argument to the last call to one of the :cfunc:`PyErr_Set\*`
   functions or to :cfunc:`PyErr_Restore`).  If not set, return *NULL*.  You do not
   own a reference to the return value, so you do not need to :cfunc:`Py_DECREF`
   it.

   .. note::

      Do not compare the return value to a specific exception; use
      :cfunc:`PyErr_ExceptionMatches` instead, shown below.  (The comparison could
      easily fail since the exception may be an instance instead of a class, in the
      case of a class exception, or it may the a subclass of the expected exception.)


.. cfunction:: int PyErr_ExceptionMatches(PyObject *exc)

   Equivalent to ``PyErr_GivenExceptionMatches(PyErr_Occurred(), exc)``.  This
   should only be called when an exception is actually set; a memory access
   violation will occur if no exception has been raised.


.. cfunction:: int PyErr_GivenExceptionMatches(PyObject *given, PyObject *exc)

   Return true if the *given* exception matches the exception in *exc*.  If
   *exc* is a class object, this also returns true when *given* is an instance
   of a subclass.  If *exc* is a tuple, all exceptions in the tuple (and
   recursively in subtuples) are searched for a match.


.. cfunction:: void PyErr_NormalizeException(PyObject**exc, PyObject**val, PyObject**tb)

   Under certain circumstances, the values returned by :cfunc:`PyErr_Fetch` below
   can be "unnormalized", meaning that ``*exc`` is a class object but ``*val`` is
   not an instance of the  same class.  This function can be used to instantiate
   the class in that case.  If the values are already normalized, nothing happens.
   The delayed normalization is implemented to improve performance.


.. cfunction:: void PyErr_Clear()

   Clear the error indicator.  If the error indicator is not set, there is no
   effect.


.. cfunction:: void PyErr_Fetch(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)

   Retrieve the error indicator into three variables whose addresses are passed.
   If the error indicator is not set, set all three variables to *NULL*.  If it is
   set, it will be cleared and you own a reference to each object retrieved.  The
   value and traceback object may be *NULL* even when the type object is not.

   .. note::

      This function is normally only used by code that needs to handle exceptions or
      by code that needs to save and restore the error indicator temporarily.


.. cfunction:: void PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)

   Set  the error indicator from the three objects.  If the error indicator is
   already set, it is cleared first.  If the objects are *NULL*, the error
   indicator is cleared.  Do not pass a *NULL* type and non-*NULL* value or
   traceback.  The exception type should be a class.  Do not pass an invalid
   exception type or value. (Violating these rules will cause subtle problems
   later.)  This call takes away a reference to each object: you must own a
   reference to each object before the call and after the call you no longer own
   these references.  (If you don't understand this, don't use this function.  I
   warned you.)

   .. note::

      This function is normally only used by code that needs to save and restore the
      error indicator temporarily; use :cfunc:`PyErr_Fetch` to save the current
      exception state.


.. cfunction:: void PyErr_SetString(PyObject *type, const char *message)

   This is the most common way to set the error indicator.  The first argument
   specifies the exception type; it is normally one of the standard exceptions,
   e.g. :cdata:`PyExc_RuntimeError`.  You need not increment its reference count.
   The second argument is an error message; it is converted to a string object.


.. cfunction:: void PyErr_SetObject(PyObject *type, PyObject *value)

   This function is similar to :cfunc:`PyErr_SetString` but lets you specify an
   arbitrary Python object for the "value" of the exception.


.. cfunction:: PyObject* PyErr_Format(PyObject *exception, const char *format, ...)

   This function sets the error indicator and returns *NULL*. *exception* should be
   a Python exception (class, not an instance).  *format* should be a string,
   containing format codes, similar to :cfunc:`printf`. The ``width.precision``
   before a format code is parsed, but the width part is ignored.

   .. % This should be exactly the same as the table in PyString_FromFormat.
   .. % One should just refer to the other.
   .. % The descriptions for %zd and %zu are wrong, but the truth is complicated
   .. % because not all compilers support the %z width modifier -- we fake it
   .. % when necessary via interpolating PY_FORMAT_SIZE_T.
   .. % Similar comments apply to the %ll width modifier and
   .. % PY_FORMAT_LONG_LONG.

   +-------------------+---------------+--------------------------------+
   | Format Characters | Type          | Comment                        |
   +===================+===============+================================+
   | :attr:`%%`        | *n/a*         | The literal % character.       |
   +-------------------+---------------+--------------------------------+
   | :attr:`%c`        | int           | A single character,            |
   |                   |               | represented as an C int.       |
   +-------------------+---------------+--------------------------------+
   | :attr:`%d`        | int           | Exactly equivalent to          |
   |                   |               | ``printf("%d")``.              |
   +-------------------+---------------+--------------------------------+
   | :attr:`%u`        | unsigned int  | Exactly equivalent to          |
   |                   |               | ``printf("%u")``.              |
   +-------------------+---------------+--------------------------------+
   | :attr:`%ld`       | long          | Exactly equivalent to          |
   |                   |               | ``printf("%ld")``.             |
   +-------------------+---------------+--------------------------------+
   | :attr:`%lu`       | unsigned long | Exactly equivalent to          |
   |                   |               | ``printf("%lu")``.             |
   +-------------------+---------------+--------------------------------+
   | :attr:`%lld`      | long long     | Exactly equivalent to          |
   |                   |               | ``printf("%lld")``.            |
   +-------------------+---------------+--------------------------------+
   | :attr:`%llu`      | unsigned      | Exactly equivalent to          |
   |                   | long long     | ``printf("%llu")``.            |
   +-------------------+---------------+--------------------------------+
   | :attr:`%zd`       | Py_ssize_t    | Exactly equivalent to          |
   |                   |               | ``printf("%zd")``.             |
   +-------------------+---------------+--------------------------------+
   | :attr:`%zu`       | size_t        | Exactly equivalent to          |
   |                   |               | ``printf("%zu")``.             |
   +-------------------+---------------+--------------------------------+
   | :attr:`%i`        | int           | Exactly equivalent to          |
   |                   |               | ``printf("%i")``.              |
   +-------------------+---------------+--------------------------------+
   | :attr:`%x`        | int           | Exactly equivalent to          |
   |                   |               | ``printf("%x")``.              |
   +-------------------+---------------+--------------------------------+
   | :attr:`%s`        | char\*        | A null-terminated C character  |
   |                   |               | array.                         |
   +-------------------+---------------+--------------------------------+
   | :attr:`%p`        | void\*        | The hex representation of a C  |
   |                   |               | pointer. Mostly equivalent to  |
   |                   |               | ``printf("%p")`` except that   |
   |                   |               | it is guaranteed to start with |
   |                   |               | the literal ``0x`` regardless  |
   |                   |               | of what the platform's         |
   |                   |               | ``printf`` yields.             |
   +-------------------+---------------+--------------------------------+

   An unrecognized format character causes all the rest of the format string to be
   copied as-is to the result string, and any extra arguments discarded.

   .. note::

      The `"%lld"` and `"%llu"` format specifiers are only available
      when :const:`HAVE_LONG_LONG` is defined.

   .. versionchanged:: 3.2
      Support for `"%lld"` and `"%llu"` added.


.. cfunction:: void PyErr_SetNone(PyObject *type)

   This is a shorthand for ``PyErr_SetObject(type, Py_None)``.


.. cfunction:: int PyErr_BadArgument()

   This is a shorthand for ``PyErr_SetString(PyExc_TypeError, message)``, where
   *message* indicates that a built-in operation was invoked with an illegal
   argument.  It is mostly for internal use.


.. cfunction:: PyObject* PyErr_NoMemory()

   This is a shorthand for ``PyErr_SetNone(PyExc_MemoryError)``; it returns *NULL*
   so an object allocation function can write ``return PyErr_NoMemory();`` when it
   runs out of memory.


.. cfunction:: PyObject* PyErr_SetFromErrno(PyObject *type)

   .. index:: single: strerror()

   This is a convenience function to raise an exception when a C library function
   has returned an error and set the C variable :cdata:`errno`.  It constructs a
   tuple object whose first item is the integer :cdata:`errno` value and whose
   second item is the corresponding error message (gotten from :cfunc:`strerror`),
   and then calls ``PyErr_SetObject(type, object)``.  On Unix, when the
   :cdata:`errno` value is :const:`EINTR`, indicating an interrupted system call,
   this calls :cfunc:`PyErr_CheckSignals`, and if that set the error indicator,
   leaves it set to that.  The function always returns *NULL*, so a wrapper
   function around a system call can write ``return PyErr_SetFromErrno(type);``
   when the system call returns an error.


.. cfunction:: PyObject* PyErr_SetFromErrnoWithFilename(PyObject *type, const char *filename)

   Similar to :cfunc:`PyErr_SetFromErrno`, with the additional behavior that if
   *filename* is not *NULL*, it is passed to the constructor of *type* as a third
   parameter.  In the case of exceptions such as :exc:`IOError` and :exc:`OSError`,
   this is used to define the :attr:`filename` attribute of the exception instance.


.. cfunction:: PyObject* PyErr_SetFromWindowsErr(int ierr)

   This is a convenience function to raise :exc:`WindowsError`. If called with
   *ierr* of :cdata:`0`, the error code returned by a call to :cfunc:`GetLastError`
   is used instead.  It calls the Win32 function :cfunc:`FormatMessage` to retrieve
   the Windows description of error code given by *ierr* or :cfunc:`GetLastError`,
   then it constructs a tuple object whose first item is the *ierr* value and whose
   second item is the corresponding error message (gotten from
   :cfunc:`FormatMessage`), and then calls ``PyErr_SetObject(PyExc_WindowsError,
   object)``. This function always returns *NULL*. Availability: Windows.


.. cfunction:: PyObject* PyErr_SetExcFromWindowsErr(PyObject *type, int ierr)

   Similar to :cfunc:`PyErr_SetFromWindowsErr`, with an additional parameter
   specifying the exception type to be raised. Availability: Windows.


.. cfunction:: PyObject* PyErr_SetFromWindowsErrWithFilename(int ierr, const char *filename)

   Similar to :cfunc:`PyErr_SetFromWindowsErr`, with the additional behavior that
   if *filename* is not *NULL*, it is passed to the constructor of
   :exc:`WindowsError` as a third parameter. Availability: Windows.


.. cfunction:: PyObject* PyErr_SetExcFromWindowsErrWithFilename(PyObject *type, int ierr, char *filename)

   Similar to :cfunc:`PyErr_SetFromWindowsErrWithFilename`, with an additional
   parameter specifying the exception type to be raised. Availability: Windows.


.. cfunction:: void PyErr_BadInternalCall()

   This is a shorthand for ``PyErr_SetString(PyExc_SystemError, message)``,
   where *message* indicates that an internal operation (e.g. a Python/C API
   function) was invoked with an illegal argument.  It is mostly for internal
   use.


.. cfunction:: int PyErr_WarnEx(PyObject *category, char *message, int stacklevel)

   Issue a warning message.  The *category* argument is a warning category (see
   below) or *NULL*; the *message* argument is a message string.  *stacklevel* is a
   positive number giving a number of stack frames; the warning will be issued from
   the  currently executing line of code in that stack frame.  A *stacklevel* of 1
   is the function calling :cfunc:`PyErr_WarnEx`, 2 is  the function above that,
   and so forth.

   This function normally prints a warning message to *sys.stderr*; however, it is
   also possible that the user has specified that warnings are to be turned into
   errors, and in that case this will raise an exception.  It is also possible that
   the function raises an exception because of a problem with the warning machinery
   (the implementation imports the :mod:`warnings` module to do the heavy lifting).
   The return value is ``0`` if no exception is raised, or ``-1`` if an exception
   is raised.  (It is not possible to determine whether a warning message is
   actually printed, nor what the reason is for the exception; this is
   intentional.)  If an exception is raised, the caller should do its normal
   exception handling (for example, :cfunc:`Py_DECREF` owned references and return
   an error value).

   Warning categories must be subclasses of :cdata:`Warning`; the default warning
   category is :cdata:`RuntimeWarning`.  The standard Python warning categories are
   available as global variables whose names are ``PyExc_`` followed by the Python
   exception name. These have the type :ctype:`PyObject\*`; they are all class
   objects. Their names are :cdata:`PyExc_Warning`, :cdata:`PyExc_UserWarning`,
   :cdata:`PyExc_UnicodeWarning`, :cdata:`PyExc_DeprecationWarning`,
   :cdata:`PyExc_SyntaxWarning`, :cdata:`PyExc_RuntimeWarning`, and
   :cdata:`PyExc_FutureWarning`.  :cdata:`PyExc_Warning` is a subclass of
   :cdata:`PyExc_Exception`; the other warning categories are subclasses of
   :cdata:`PyExc_Warning`.

   For information about warning control, see the documentation for the
   :mod:`warnings` module and the :option:`-W` option in the command line
   documentation.  There is no C API for warning control.


.. cfunction:: int PyErr_WarnExplicit(PyObject *category, const char *message, const char *filename, int lineno, const char *module, PyObject *registry)

   Issue a warning message with explicit control over all warning attributes.  This
   is a straightforward wrapper around the Python function
   :func:`warnings.warn_explicit`, see there for more information.  The *module*
   and *registry* arguments may be set to *NULL* to get the default effect
   described there.


.. cfunction:: int PyErr_CheckSignals()

   .. index::
      module: signal
      single: SIGINT
      single: KeyboardInterrupt (built-in exception)

   This function interacts with Python's signal handling.  It checks whether a
   signal has been sent to the processes and if so, invokes the corresponding
   signal handler.  If the :mod:`signal` module is supported, this can invoke a
   signal handler written in Python.  In all cases, the default effect for
   :const:`SIGINT` is to raise the  :exc:`KeyboardInterrupt` exception.  If an
   exception is raised the error indicator is set and the function returns ``-1``;
   otherwise the function returns ``0``.  The error indicator may or may not be
   cleared if it was previously set.


.. cfunction:: void PyErr_SetInterrupt()

   .. index::
      single: SIGINT
      single: KeyboardInterrupt (built-in exception)

   This function simulates the effect of a :const:`SIGINT` signal arriving --- the
   next time :cfunc:`PyErr_CheckSignals` is called,  :exc:`KeyboardInterrupt` will
   be raised.  It may be called without holding the interpreter lock.

   .. % XXX This was described as obsolete, but is used in
   .. % _thread.interrupt_main() (used from IDLE), so it's still needed.


.. cfunction:: int PySignal_SetWakeupFd(int fd)

   This utility function specifies a file descriptor to which a ``'\0'`` byte will
   be written whenever a signal is received.  It returns the previous such file
   descriptor.  The value ``-1`` disables the feature; this is the initial state.
   This is equivalent to :func:`signal.set_wakeup_fd` in Python, but without any
   error checking.  *fd* should be a valid file descriptor.  The function should
   only be called from the main thread.


.. cfunction:: PyObject* PyErr_NewException(char *name, PyObject *base, PyObject *dict)

   This utility function creates and returns a new exception object. The *name*
   argument must be the name of the new exception, a C string of the form
   ``module.class``.  The *base* and *dict* arguments are normally *NULL*.  This
   creates a class object derived from :exc:`Exception` (accessible in C as
   :cdata:`PyExc_Exception`).

   The :attr:`__module__` attribute of the new class is set to the first part (up
   to the last dot) of the *name* argument, and the class name is set to the last
   part (after the last dot).  The *base* argument can be used to specify alternate
   base classes; it can either be only one class or a tuple of classes. The *dict*
   argument can be used to specify a dictionary of class variables and methods.


.. cfunction:: PyObject* PyErr_NewExceptionWithDoc(char *name, char *doc, PyObject *base, PyObject *dict)

   Same as :cfunc:`PyErr_NewException`, except that the new exception class can
   easily be given a docstring: If *doc* is non-*NULL*, it will be used as the
   docstring for the exception class.

   .. versionadded:: 3.2


.. cfunction:: void PyErr_WriteUnraisable(PyObject *obj)

   This utility function prints a warning message to ``sys.stderr`` when an
   exception has been set but it is impossible for the interpreter to actually
   raise the exception.  It is used, for example, when an exception occurs in an
   :meth:`__del__` method.

   The function is called with a single argument *obj* that identifies the context
   in which the unraisable exception occurred. The repr of *obj* will be printed in
   the warning message.


Exception Objects
=================

.. cfunction:: PyObject* PyException_GetTraceback(PyObject *ex)

   Return the traceback associated with the exception as a new reference, as
   accessible from Python through :attr:`__traceback__`.  If there is no
   traceback associated, this returns *NULL*.


.. cfunction:: int PyException_SetTraceback(PyObject *ex, PyObject *tb)

   Set the traceback associated with the exception to *tb*.  Use ``Py_None`` to
   clear it.


.. cfunction:: PyObject* PyException_GetContext(PyObject *ex)

   Return the context (another exception instance during whose handling *ex* was
   raised) associated with the exception as a new reference, as accessible from
   Python through :attr:`__context__`.  If there is no context associated, this
   returns *NULL*.


.. cfunction:: void PyException_SetContext(PyObject *ex, PyObject *ctx)

   Set the context associated with the exception to *ctx*.  Use *NULL* to clear
   it.  There is no type check to make sure that *ctx* is an exception instance.
   This steals a reference to *ctx*.


.. cfunction:: PyObject* PyException_GetCause(PyObject *ex)

   Return the cause (another exception instance set by ``raise ... from ...``)
   associated with the exception as a new reference, as accessible from Python
   through :attr:`__cause__`.  If there is no cause associated, this returns
   *NULL*.


.. cfunction:: void PyException_SetCause(PyObject *ex, PyObject *ctx)

   Set the cause associated with the exception to *ctx*.  Use *NULL* to clear
   it.  There is no type check to make sure that *ctx* is an exception instance.
   This steals a reference to *ctx*.


Recursion Control
=================

These two functions provide a way to perform safe recursive calls at the C
level, both in the core and in extension modules.  They are needed if the
recursive code does not necessarily invoke Python code (which tracks its
recursion depth automatically).

.. cfunction:: int Py_EnterRecursiveCall(char *where)

   Marks a point where a recursive C-level call is about to be performed.

   If :const:`USE_STACKCHECK` is defined, this function checks if the the OS
   stack overflowed using :cfunc:`PyOS_CheckStack`.  In this is the case, it
   sets a :exc:`MemoryError` and returns a nonzero value.

   The function then checks if the recursion limit is reached.  If this is the
   case, a :exc:`RuntimeError` is set and a nonzero value is returned.
   Otherwise, zero is returned.

   *where* should be a string such as ``" in instance check"`` to be
   concatenated to the :exc:`RuntimeError` message caused by the recursion depth
   limit.

.. cfunction:: void Py_LeaveRecursiveCall()

   Ends a :cfunc:`Py_EnterRecursiveCall`.  Must be called once for each
   *successful* invocation of :cfunc:`Py_EnterRecursiveCall`.


.. _standardexceptions:

Standard Exceptions
===================

All standard Python exceptions are available as global variables whose names are
``PyExc_`` followed by the Python exception name.  These have the type
:ctype:`PyObject\*`; they are all class objects.  For completeness, here are all
the variables:

+------------------------------------+----------------------------+----------+
| C Name                             | Python Name                | Notes    |
+====================================+============================+==========+
| :cdata:`PyExc_BaseException`       | :exc:`BaseException`       | \(1)     |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_Exception`           | :exc:`Exception`           | \(1)     |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_ArithmeticError`     | :exc:`ArithmeticError`     | \(1)     |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_LookupError`         | :exc:`LookupError`         | \(1)     |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_AssertionError`      | :exc:`AssertionError`      |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_AttributeError`      | :exc:`AttributeError`      |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_EOFError`            | :exc:`EOFError`            |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_EnvironmentError`    | :exc:`EnvironmentError`    | \(1)     |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_FloatingPointError`  | :exc:`FloatingPointError`  |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_IOError`             | :exc:`IOError`             |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_ImportError`         | :exc:`ImportError`         |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_IndexError`          | :exc:`IndexError`          |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_KeyError`            | :exc:`KeyError`            |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_KeyboardInterrupt`   | :exc:`KeyboardInterrupt`   |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_MemoryError`         | :exc:`MemoryError`         |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_NameError`           | :exc:`NameError`           |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_NotImplementedError` | :exc:`NotImplementedError` |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_OSError`             | :exc:`OSError`             |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_OverflowError`       | :exc:`OverflowError`       |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_ReferenceError`      | :exc:`ReferenceError`      | \(2)     |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_RuntimeError`        | :exc:`RuntimeError`        |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_SyntaxError`         | :exc:`SyntaxError`         |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_SystemError`         | :exc:`SystemError`         |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_SystemExit`          | :exc:`SystemExit`          |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_TypeError`           | :exc:`TypeError`           |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_ValueError`          | :exc:`ValueError`          |          |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_WindowsError`        | :exc:`WindowsError`        | \(3)     |
+------------------------------------+----------------------------+----------+
| :cdata:`PyExc_ZeroDivisionError`   | :exc:`ZeroDivisionError`   |          |
+------------------------------------+----------------------------+----------+

.. index::
   single: PyExc_BaseException
   single: PyExc_Exception
   single: PyExc_ArithmeticError
   single: PyExc_LookupError
   single: PyExc_AssertionError
   single: PyExc_AttributeError
   single: PyExc_EOFError
   single: PyExc_EnvironmentError
   single: PyExc_FloatingPointError
   single: PyExc_IOError
   single: PyExc_ImportError
   single: PyExc_IndexError
   single: PyExc_KeyError
   single: PyExc_KeyboardInterrupt
   single: PyExc_MemoryError
   single: PyExc_NameError
   single: PyExc_NotImplementedError
   single: PyExc_OSError
   single: PyExc_OverflowError
   single: PyExc_ReferenceError
   single: PyExc_RuntimeError
   single: PyExc_SyntaxError
   single: PyExc_SystemError
   single: PyExc_SystemExit
   single: PyExc_TypeError
   single: PyExc_ValueError
   single: PyExc_WindowsError
   single: PyExc_ZeroDivisionError

Notes:

(1)
   This is a base class for other standard exceptions.

(2)
   This is the same as :exc:`weakref.ReferenceError`.

(3)
   Only defined on Windows; protect code that uses this by testing that the
   preprocessor macro ``MS_WINDOWS`` is defined.
