\section{\module{traceback} ---
         Print or retrieve a stack traceback}

\declaremodule{standard}{traceback}
\modulesynopsis{Print or retrieve a stack traceback.}


This module provides a standard interface to extract, format and print
stack traces of Python programs.  It exactly mimics the behavior of
the Python interpreter when it prints a stack trace.  This is useful
when you want to print stack traces under program control, such as in a
``wrapper'' around the interpreter.

The module uses traceback objects --- this is the object type that is
stored in the variables \code{sys.exc_traceback} (deprecated) and
\code{sys.last_traceback} and returned as the third item from
\function{sys.exc_info()}.
\obindex{traceback}

The module defines the following functions:

\begin{funcdesc}{print_tb}{traceback\optional{, limit\optional{, file}}}
Print up to \var{limit} stack trace entries from \var{traceback}.  If
\var{limit} is omitted or \code{None}, all entries are printed.
If \var{file} is omitted or \code{None}, the output goes to
\code{sys.stderr}; otherwise it should be an open file or file-like
object to receive the output.
\end{funcdesc}

\begin{funcdesc}{print_exception}{type, value, traceback\optional{,
                                  limit\optional{, file}}}
Print exception information and up to \var{limit} stack trace entries
from \var{traceback} to \var{file}.
This differs from \function{print_tb()} in the
following ways: (1) if \var{traceback} is not \code{None}, it prints a
header \samp{Traceback (most recent call last):}; (2) it prints the
exception \var{type} and \var{value} after the stack trace; (3) if
\var{type} is \exception{SyntaxError} and \var{value} has the
appropriate format, it prints the line where the syntax error occurred
with a caret indicating the approximate position of the error.
\end{funcdesc}

\begin{funcdesc}{print_exc}{\optional{limit\optional{, file}}}
This is a shorthand for \code{print_exception(sys.exc_type,
sys.exc_value, sys.exc_traceback, \var{limit}, \var{file})}.  (In
fact, it uses \function{sys.exc_info()} to retrieve the same
information in a thread-safe way instead of using the deprecated
variables.)
\end{funcdesc}

\begin{funcdesc}{format_exc}{\optional{limit\optional{, file}}}
This is like \code{print_exc(\var{limit})} but returns a string
instead of printing to a file.
\versionadded{2.4}
\end{funcdesc}

\begin{funcdesc}{print_last}{\optional{limit\optional{, file}}}
This is a shorthand for \code{print_exception(sys.last_type,
sys.last_value, sys.last_traceback, \var{limit}, \var{file})}.
\end{funcdesc}

\begin{funcdesc}{print_stack}{\optional{f\optional{, limit\optional{, file}}}}
This function prints a stack trace from its invocation point.  The
optional \var{f} argument can be used to specify an alternate stack
frame to start.  The optional \var{limit} and \var{file} arguments have the
same meaning as for \function{print_exception()}.
\end{funcdesc}

\begin{funcdesc}{extract_tb}{traceback\optional{, limit}}
Return a list of up to \var{limit} ``pre-processed'' stack trace
entries extracted from the traceback object \var{traceback}.  It is
useful for alternate formatting of stack traces.  If \var{limit} is
omitted or \code{None}, all entries are extracted.  A
``pre-processed'' stack trace entry is a quadruple (\var{filename},
\var{line number}, \var{function name}, \var{text}) representing
the information that is usually printed for a stack trace.  The
\var{text} is a string with leading and trailing whitespace
stripped; if the source is not available it is \code{None}.
\end{funcdesc}

\begin{funcdesc}{extract_stack}{\optional{f\optional{, limit}}}
Extract the raw traceback from the current stack frame.  The return
value has the same format as for \function{extract_tb()}.  The
optional \var{f} and \var{limit} arguments have the same meaning as
for \function{print_stack()}.
\end{funcdesc}

\begin{funcdesc}{format_list}{list}
Given a list of tuples as returned by \function{extract_tb()} or
\function{extract_stack()}, return a list of strings ready for
printing.  Each string in the resulting list corresponds to the item
with the same index in the argument list.  Each string ends in a
newline; the strings may contain internal newlines as well, for those
items whose source text line is not \code{None}.
\end{funcdesc}

\begin{funcdesc}{format_exception_only}{type, value}
Format the exception part of a traceback.  The arguments are the
exception type and value such as given by \code{sys.last_type} and
\code{sys.last_value}.  The return value is a list of strings, each
ending in a newline.  Normally, the list contains a single string;
however, for \exception{SyntaxError} exceptions, it contains several
lines that (when printed) display detailed information about where the
syntax error occurred.  The message indicating which exception
occurred is the always last string in the list.
\end{funcdesc}

\begin{funcdesc}{format_exception}{type, value, tb\optional{, limit}}
Format a stack trace and the exception information.  The arguments 
have the same meaning as the corresponding arguments to
\function{print_exception()}.  The return value is a list of strings,
each ending in a newline and some containing internal newlines.  When
these lines are concatenated and printed, exactly the same text is
printed as does \function{print_exception()}.
\end{funcdesc}

\begin{funcdesc}{format_tb}{tb\optional{, limit}}
A shorthand for \code{format_list(extract_tb(\var{tb}, \var{limit}))}.
\end{funcdesc}

\begin{funcdesc}{format_stack}{\optional{f\optional{, limit}}}
A shorthand for \code{format_list(extract_stack(\var{f}, \var{limit}))}.
\end{funcdesc}

\begin{funcdesc}{tb_lineno}{tb}
This function returns the current line number set in the traceback
object.  This function was necessary because in versions of Python
prior to 2.3 when the \programopt{-O} flag was passed to Python the
\code{\var{tb}.tb_lineno} was not updated correctly.  This function
has no use in versions past 2.3.
\end{funcdesc}


\subsection{Traceback Example \label{traceback-example}}

This simple example implements a basic read-eval-print loop, similar
to (but less useful than) the standard Python interactive interpreter
loop.  For a more complete implementation of the interpreter loop,
refer to the \refmodule{code} module.

\begin{verbatim}
import sys, traceback

def run_user_code(envdir):
    source = raw_input(">>> ")
    try:
        exec source in envdir
    except:
        print "Exception in user code:"
        print '-'*60
        traceback.print_exc(file=sys.stdout)
        print '-'*60

envdir = {}
while 1:
    run_user_code(envdir)
\end{verbatim}
