\section{Built-in Exceptions}

Exceptions are string objects.  Two distinct string objects with the
same value are 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.

The following exceptions 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).

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.

\renewcommand{\indexsubitem}{(built-in exception)}

\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, \code{TypeError} is raised.)
\end{excdesc}

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

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

\begin{excdesc}{ImportError}
% XXXJH xref to import statement?
  Raised when an \code{import} statement fails to find the module
  definition or when a \code{from {\rm \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, \code{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
\key{DEL}).  During execution, a check for interrupts is made regularly.
% XXXJH xrefs here
  Interrupts typed when a built-in function \code{input()} or
  \code{raw_input()}) is waiting for input also raise this exception.  No
  associated value.
\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 \code{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}{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 \code{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 a relic from a previous
  version of the interpreter; it is not used any more except by some
  extension modules that haven't been converted to define their own
  exceptions yet.)
\end{excdesc}

\begin{excdesc}{SyntaxError}
% XXXJH xref to these functions?
  Raised when the parser encounters a syntax error.  This may occur in
  an \code{import} statement, in an \code{exec} statement, in a call
  to the built-in function \code{eval()} or \code{input()}, or
  when reading the initial script or standard input (also
  interactively).
\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 \code{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 \code{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.
  
  A call to \code{sys.exit} is translated into an exception so that
  clean-up handlers (\code{finally} clauses of \code{try} statements)
  can be executed, and so that a debugger can execute a script without
  running the risk of losing control.  The \code{posix._exit()} function
  can be used if it is absolutely positively necessary to exit
  immediately (e.g., after a \code{fork()} in the child process).
\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}{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
  \code{IndexError}.
\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}
