How to handle AssertionError in Python and find out which line or statement it occurred on? How to handle AssertionError in Python and find out which line or statement it occurred on? python python

How to handle AssertionError in Python and find out which line or statement it occurred on?


Use the traceback module:

import sysimport tracebacktry:    assert True    assert 7 == 7    assert 1 == 2    # many more statements like thisexcept AssertionError:    _, _, tb = sys.exc_info()    traceback.print_tb(tb) # Fixed format    tb_info = traceback.extract_tb(tb)    filename, line, func, text = tb_info[-1]    print('An error occurred on line {} in statement {}'.format(line, text))    exit(1)


The traceback module and sys.exc_info are overkill for tracking down the source of an exception. That's all in the default traceback. So instead of calling exit(1) just re-raise:

try:    assert "birthday cake" == "ice cream cake", "Should've asked for pie"except AssertionError:    print 'Houston, we have a problem.'    raise

Which gives the following output that includes the offending statement and line number:

Houston, we have a problem.Traceback (most recent call last):  File "/tmp/poop.py", line 2, in <module>    assert "birthday cake" == "ice cream cake", "Should've asked for pie"AssertionError: Should've asked for pie

Similarly the logging module makes it easy to log a traceback for any exception (including those which are caught and never re-raised):

import loggingtry:    assert False == True except AssertionError:    logging.error("Nothing is real but I can't quit...", exc_info=True)