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

11,393

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).

Share:
11,393
mulllhausen
Author by

mulllhausen

javascript, python, php, mysql, html, css, delphi, bash, c#, mssql

Updated on June 16, 2022

Comments

  • mulllhausen
    mulllhausen almost 2 years

    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'
    
  • eyquem
    eyquem over 10 years
    Your answer led me to the precise solution.
  • andyn
    andyn over 7 years
    This does not work due to reasons pointed out by Lukas G. in the accepted answer that was posted earlier than yours.