\section{Built-in Exceptions}

\declaremodule{standard}{exceptions}
\modulesynopsis{Standard exceptions classes.}


Exceptions can be class objects or string objects.  Though most
exceptions have been string objects in past versions of Python, in
Python 1.5 and newer versions, all standard exceptions have been
converted to class objects, and users are encouraged to do the same.
The exceptions are defined in the module \module{exceptions}.  This
module never needs to be imported explicitly: the exceptions are
provided in the built-in namespace.

Two distinct string objects with the same value are considered different
exceptions.  This is done to force programmers to use exception names
rather than their string value when specifying exception handlers.
The string value of all built-in exceptions is their name, but this is
not a requirement for user-defined exceptions or exceptions defined by
library modules.

For class exceptions, in a \keyword{try}\stindex{try} statement with
an \keyword{except}\stindex{except} clause that mentions a particular
class, that clause also handles any exception classes derived from
that class (but not exception classes from which \emph{it} is
derived).  Two exception classes that are not related via subclassing
are never equivalent, even if they have the same name.

The built-in exceptions listed below 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 containing several items of
information (e.g., an error code and a string explaining the code).
The associated value is the second argument to the
\keyword{raise}\stindex{raise} statement.  For string exceptions, the
associated value itself will be stored in the variable named as the
second argument of the \keyword{except} clause (if any).  For class
exceptions, that variable receives the exception instance.  If the
exception class is derived from the standard root class
\exception{Exception}, the associated value is present as the
exception instance's \member{args} attribute, and possibly on other
attributes as well.

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.

\setindexsubitem{(built-in exception base class)}

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

\begin{excdesc}{Exception}
The root class for exceptions.  All built-in exceptions are derived
from this class.  All user-defined exceptions should also be derived
from this class, but this is not (yet) enforced.  The \function{str()}
function, when applied to an instance of this class (or most derived
classes) returns the string value of the argument or arguments, or an
empty string if no arguments were given to the constructor.  When used
as a sequence, this accesses the arguments given to the constructor
(handy for backward compatibility with old code).  The arguments are
also available on the instance's \member{args} attribute, as a tuple.
\end{excdesc}

\begin{excdesc}{StandardError}
The base class for all built-in exceptions except
\exception{StopIteration} and \exception{SystemExit}.
\exception{StandardError} itself is derived from the root class
\exception{Exception}.
\end{excdesc}

\begin{excdesc}{ArithmeticError}
The base class for those built-in exceptions that are raised for
various arithmetic errors: \exception{OverflowError},
\exception{ZeroDivisionError}, \exception{FloatingPointError}.
\end{excdesc}

\begin{excdesc}{LookupError}
The base class for the exceptions that are raised when a key or
index used on a mapping or sequence is invalid: \exception{IndexError},
\exception{KeyError}.  This can be raised directly by
\function{sys.setdefaultencoding()}.
\end{excdesc}

\begin{excdesc}{EnvironmentError}
The base class for exceptions that
can occur outside the Python system: \exception{IOError},
\exception{OSError}.  When exceptions of this type are created with a
2-tuple, the first item is available on the instance's \member{errno}
attribute (it is assumed to be an error number), and the second item
is available on the \member{strerror} attribute (it is usually the
associated error message).  The tuple itself is also available on the
\member{args} attribute.
\versionadded{1.5.2}

When an \exception{EnvironmentError} exception is instantiated with a
3-tuple, the first two items are available as above, while the third
item is available on the \member{filename} attribute.  However, for
backwards compatibility, the \member{args} attribute contains only a
2-tuple of the first two constructor arguments.

The \member{filename} attribute is \code{None} when this exception is
created with other than 3 arguments.  The \member{errno} and
\member{strerror} attributes are also \code{None} when the instance was
created with other than 2 or 3 arguments.  In this last case,
\member{args} contains the verbatim constructor arguments as a tuple.
\end{excdesc}


\setindexsubitem{(built-in exception)}

The following exceptions are the exceptions that are actually raised.

\begin{excdesc}{AssertionError}
\stindex{assert}
Raised when an \keyword{assert} statement fails.
\end{excdesc}

\begin{excdesc}{AttributeError}
% xref to attribute reference?
  Raised when an attribute reference or assignment fails.  (When an
  object does not support attribute references or attribute assignments
  at all, \exception{TypeError} is raised.)
\end{excdesc}

\begin{excdesc}{EOFError}
% XXXJH xrefs here
  Raised when one of the built-in functions (\function{input()} or
  \function{raw_input()}) hits an end-of-file condition (\EOF{}) without
  reading any data.
% XXXJH xrefs here
  (N.B.: the \method{read()} and \method{readline()} methods of file
  objects return an empty string when they hit \EOF{}.)
\end{excdesc}

\begin{excdesc}{FloatingPointError}
  Raised when a floating point operation fails.  This exception is
  always defined, but can only be raised when Python is configured
  with the \longprogramopt{with-fpectl} option, or the
  \constant{WANT_SIGFPE_HANDLER} symbol is defined in the
  \file{pyconfig.h} file.
\end{excdesc}

\begin{excdesc}{IOError}
% XXXJH xrefs here
  Raised when an I/O operation (such as a \keyword{print} statement,
  the built-in \function{open()} function or a method of a file
  object) fails for an I/O-related reason, e.g., ``file not found'' or
  ``disk full''.

  This class is derived from \exception{EnvironmentError}.  See the
  discussion above for more information on exception instance
  attributes.
\end{excdesc}

\begin{excdesc}{ImportError}
% XXXJH xref to import statement?
  Raised when an \keyword{import} statement fails to find the module
  definition or when a \code{from \textrm{\ldots} import} fails to find a
  name that is to be imported.
\end{excdesc}

\begin{excdesc}{IndexError}
% XXXJH xref to sequences
  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 a
  plain integer, \exception{TypeError} is raised.)
\end{excdesc}

\begin{excdesc}{KeyError}
% XXXJH xref to mapping objects?
  Raised when a mapping (dictionary) key is not found in the set of
  existing keys.
\end{excdesc}

\begin{excdesc}{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.
% XXXJH xrefs here
  Interrupts typed when a built-in function \function{input()} or
  \function{raw_input()}) is waiting for input also raise this
  exception.
\end{excdesc}

\begin{excdesc}{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 \cfunction{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.
\end{excdesc}

\begin{excdesc}{NameError}
  Raised when a local or global name is not found.  This applies only
  to unqualified names.  The associated value is the name that could
  not be found.
\end{excdesc}

\begin{excdesc}{NotImplementedError}
  This exception is derived from \exception{RuntimeError}.  In user
  defined base classes, abstract methods should raise this exception
  when they require derived classes to override the method.
  \versionadded{1.5.2}
\end{excdesc}

\begin{excdesc}{OSError}
  %xref for os module
  This class is derived from \exception{EnvironmentError} and is used
  primarily as the \refmodule{os} module's \code{os.error} exception.
  See \exception{EnvironmentError} above for a description of the
  possible associated values.
  \versionadded{1.5.2}
\end{excdesc}

\begin{excdesc}{OverflowError}
% XXXJH reference to long's and/or int's?
  Raised when the result of an arithmetic operation is too large to be
  represented.  This cannot occur for long integers (which would rather
  raise \exception{MemoryError} than give up).  Because of the lack of
  standardization of floating point exception handling in C, most
  floating point operations also aren't checked.  For plain integers,
  all operations that can overflow are checked except left shift, where
  typical applications prefer to drop bits than raise an exception.
\end{excdesc}

\begin{excdesc}{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.  (This exception is mostly a relic from a
  previous version of the interpreter; it is not used very much any
  more.)
\end{excdesc}

\begin{excdesc}{StopIteration}
  Raised by an iterator's \method{next()} method to signal that there
  are no further values.
  This is derived from \exception{Exception} rather than
  \exception{StandardError}, since this is not considered an error in
  its normal application.
  \versionadded{2.2}
\end{excdesc}

\begin{excdesc}{SyntaxError}
% XXXJH xref to these functions?
  Raised when the parser encounters a syntax error.  This may occur in
  an \keyword{import} statement, in an \keyword{exec} statement, in a call
  to the built-in function \function{eval()} or \function{input()}, or
  when reading the initial script or standard input (also
  interactively).

When class exceptions are used, instances of this class have
atttributes \member{filename}, \member{lineno}, \member{offset} and
\member{text} for easier access to the details; for string exceptions,
the associated value is usually a tuple of the form
\code{(message, (filename, lineno, offset, text))}.
For class exceptions, \function{str()} returns only the message.
\end{excdesc}

\begin{excdesc}{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).
  
  You should report this to the author or maintainer of your Python
  interpreter.  Be sure to report the version string of the Python
  interpreter (\code{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.
\end{excdesc}

\begin{excdesc}{SystemExit}
% XXXJH xref to module sys?
  This exception is raised by the \function{sys.exit()} function.  When it
  is not handled, the Python interpreter exits; no stack traceback is
  printed.  If the associated value is a plain integer, it specifies the
  system exit status (passed to C's \cfunction{exit()} function); if it is
  \code{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.

  Instances have an attribute \member{code} which is set to the
  proposed exit status or error message (defaulting to \code{None}).
  Also, this exception derives directly from \exception{Exception} and
  not \exception{StandardError}, since it is not technically an error.

  A call to \function{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 \function{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
  \function{fork()}).
\end{excdesc}

\begin{excdesc}{TypeError}
  Raised when a built-in operation or function is applied to an object
  of inappropriate type.  The associated value is a string giving
  details about the type mismatch.
\end{excdesc}

\begin{excdesc}{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 \exception{NameError}.
\versionadded{2.0}
\end{excdesc}

\begin{excdesc}{UnicodeError}
  Raised when a Unicode-related encoding or decoding error occurs.  It
  is a subclass of \exception{ValueError}.
\versionadded{2.0}
\end{excdesc}

\begin{excdesc}{ValueError}
  Raised when a built-in 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
  \exception{IndexError}.
\end{excdesc}

\begin{excdesc}{WindowsError}
  Raised when a Windows-specific error occurs or when the error number
  does not correspond to an \cdata{errno} value.  The
  \member{errno} and \member{strerror} values are created from the
  return values of the \cfunction{GetLastError()} and
  \cfunction{FormatMessage()} functions from the Windows Platform API.
  This is a subclass of \exception{OSError}.
\versionadded{2.0}
\end{excdesc}

\begin{excdesc}{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.
\end{excdesc}


\setindexsubitem{(built-in warning category)}

The following exceptions are used as warning categories; see the
\module{warnings} module for more information.

\begin{excdesc}{Warning}
Base class for warning categories.
\end{excdesc}

\begin{excdesc}{UserWarning}
Base class for warnings generated by user code.
\end{excdesc}

\begin{excdesc}{DeprecationWarning}
Base class for warnings about deprecated features.
\end{excdesc}

\begin{excdesc}{SyntaxWarning}
Base class for warnings about dubious syntax
\end{excdesc}

\begin{excdesc}{RuntimeWarning}
Base class for warnings about dubious runtime behavior.
\end{excdesc}
