pythonexceptiontry-catchtraceback

Catch and print full Python exception traceback without halting/exiting the program


I want to catch and log exceptions without exiting, e.g.,

try:
    do_stuff()
except Exception as err:
    print(Exception, err)
    # I want to print the entire traceback here,
    # not just the exception name and details

I want to print the exact same output that is printed when the exception is raised without the try/except intercepting the exception, and I do not want it to exit my program.


Solution

  • Some other answer have already pointed out the traceback module.

    Please notice that with print_exc, in some corner cases, you will not obtain what you would expect. In Python 2.x:

    import traceback
    
    try:
        raise TypeError("Oups!")
    except Exception, err:
        try:
            raise TypeError("Again !?!")
        except:
            pass
    
        traceback.print_exc()
    

    ...will display the traceback of the last exception:

    Traceback (most recent call last):
      File "e.py", line 7, in <module>
        raise TypeError("Again !?!")
    TypeError: Again !?!
    

    If you really need to access the original traceback one solution is to cache the exception infos as returned from exc_info in a local variable and display it using print_exception:

    import traceback
    import sys
    
    try:
        raise TypeError("Oups!")
    except Exception, err:
        try:
            exc_info = sys.exc_info()
    
            # do you usefull stuff here
            # (potentially raising an exception)
            try:
                raise TypeError("Again !?!")
            except:
                pass
            # end of useful stuff
    
    
        finally:
            # Display the *original* exception
            traceback.print_exception(*exc_info)
            del exc_info
    

    Producing:

    Traceback (most recent call last):
      File "t.py", line 6, in <module>
        raise TypeError("Oups!")
    TypeError: Oups!
    

    Few pitfalls with this though:


    On the other hand, by allowing you to access the traceback associated with an exception, Python 3 produce a less surprising result:

    import traceback
    
    try:
        raise TypeError("Oups!")
    except Exception as err:
        try:
            raise TypeError("Again !?!")
        except:
            pass
    
        traceback.print_tb(err.__traceback__)
    

    ... will display:

      File "e3.py", line 4, in <module>
        raise TypeError("Oups!")