Prepending to traceback

Larry Bates lbates at syscononline.com
Wed Feb 2 11:18:28 EST 2005


Replace system exception hook with your on function that gets
called when exception is raised (not fully tested):

#
# Define a function that is called when system exception happens
#
def excepthook(self, type, value, tb):
     #
     # This function allows the user to redefine what happens if the program
     # aborts due to an uncaught exception.
     import traceback
     #
     # Prepend your lines to tblines list here
     #
     tblines=['PyParsing, line 5, in SomeStatement\n',
              'PARSER TEST FOR TESTING MISSING TERM\n']

     #
     # Get traceback lines and append the current session log
     #
     tblines.extend(traceback.format_exception(type, value, tb))
     map(sys.stdout.writelines, tblines)  # Always write exceptions to screen
     sys.exit(2)

#
# At top of your main program:
# Set the sys.excepthook so I can clean up properly if main program aborts
#
sys.excepthook=excepthook

Larry Bates



Stefan Behnel wrote:
> Hi!
> 
> I'm writing a parser using pyparsing and I would like to augment the 
> ParserException tracebacks with information about the actual error line 
> *in the parsed text*. Pyparsing provides me with everything I need 
> (parsed line and column), but is there a way to push that information on 
> the traceback?
> 
> 
> To make it a bit clearer, tracebacks currently look like this:
> 
> Traceback (most recent call last):
>  ...
>   File "/usr/lib/python2.4/site-packages/pyparsing.py", line 456, in parse
>     loc,tokens = self.parseImpl( instring, loc, doActions )
>   File "/usr/lib/python2.4/site-packages/pyparsing.py", line 727, in 
> parseImpl
>     raise exc
> ParseException: Expected "SOMEOTHERTERM" (146), (5,9)
> 
> 
> I want them to look like this:
> 
> Traceback (most recent call last):
>  ...
>   File "/usr/lib/python2.4/site-packages/pyparsing.py", line 456, in parse
>     loc,tokens = self.parseImpl( instring, loc, doActions )
>   File "/usr/lib/python2.4/site-packages/pyparsing.py", line 727, in 
> parseImpl
>     raise exc
>   PyParsing, line 5, in SomeStatement
>     PARSER TEST FOR TESTING MISSING TERM
> ParseException: Expected "SOMEOTHERTERM" (146), (5,9)
> 
> 
> where "PARSER TEST FOR TESTING MISSING TERM" is a line parsed by 
> pyparsing that leads to raising a ParseException. I wouldn't mind too 
> much not having the original traceback, though I'd prefer it. I remember 
> having read somewhere that there is a way to embed an exceptions in 
> another one, that might help.
> 
> How can I alter or create such Tracebacks?
> 
> Thanks,
> Stefan



More information about the Python-list mailing list