\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 attributes 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}
