How can I get the traceback object ( sys.exc_info()[2] , same as sys.exc_traceback ) as a string?

mulllhausen picture mulllhausen · Nov 27, 2013 · Viewed 10.3k times · Source

I have a function which catches all exceptions, and I want to be able to get the traceback as a string within this function.

So far this is not working:

def handle_errors(error_type, error_message, error_traceback):
    """catch errors"""
    import traceback
    error = {}
    error['type'] = error_type.__name__
    error['message'] = str(error_message)
    error['file'] = os.path.split(error_traceback.tb_frame.f_code.co_filename)[1]
    error['line'] = error_traceback.tb_lineno
    error['traceback'] = repr(traceback.print_tb(error_traceback))
    ### finalise error handling and exit ###

sys.excepthook = handle_errors

It's the error['traceback'] line which is wrong. Do i even need to use the traceback module?

As per this other vaguely similar question, I have tried:

error['traceback'] = repr(error_traceback.print_exc())

...but this gives an error:

Error in sys.excepthook:
Traceback (most recent call last):
  File "xxxxxxxxxxx", line 54, in handle_errors
    error['traceback'] = repr(error_traceback.print_exc())
AttributeError: 'traceback' object has no attribute 'print_exc'

Answer

Lukas Graf picture Lukas Graf · Nov 27, 2013

Use traceback.format_tb() instead of print_tb() to get the formatted stack trace (as a list of lines):

error['traceback'] = ''.join(traceback.format_tb(error_traceback))

print_tb() directly prints the traceback, that's why you get None as a result (that's the default for any Python function that doesn't return anything explicitely).