Credit: Bryn Keller
You want to display all of the available information when an uncaught exception is raised.
A traceback object is basically a linked list of nodes, in which each node refers to a frame object. Frame objects, in turn, form their own linked list in the opposite order from the linked list of traceback nodes, so we can walk back and forth if needed. This recipe exploits this structure and the rich amount of information held by frame objects, including, in particular, the dictionary of local variables for the function corresponding to each frame:
import sys, traceback def print_exc_plus( ): """ Print the usual traceback information, followed by a listing of all the local variables in each frame. """ tb = sys.exc_info( ) while tb.tb_next: tb = tb.tb_next stack = [ ] f = tb.tb_frame while f: stack.append(f) f = f.f_back stack.reverse( ) traceback.print_exc( ) print "Locals by frame, innermost last" for frame in stack: print print "Frame %s in %s at line %s" % (frame.f_code.co_name, frame.f_code.co_filename, frame.f_lineno) for key, value in frame.f_locals.items( ): print "\t%20s = " % key, # we must _absolutely_ avoid propagating exceptions, and str(value) # COULD cause any exception, so we MUST catch any...: try: print value except: print "<ERROR WHILE PRINTING VALUE>"
The standard Python
traceback module provides useful functions to give information about where and why an error occurred. However, ...