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

I want to handle AssertionErrors both to hide unnecessary parts of the stack trace from the user and to print a message as to why the error occurred and what the user should do about it.

Is there any way to find out on which line or statement the assert failed within the except block?

try: assert True assert 7 == 7 assert 1 == 2 # many more statements like this except AssertionError: print 'Houston, we have a problem.' print print 'An error occurred on line ???? in statement ???' exit(1) 

I don't want to have to add this to every assert statement:

assert 7 == 7, "7 == 7" 

because it repeats information.

5

2 Answers

Use the traceback module:

import sys import traceback try: assert True assert 7 == 7 assert 1 == 2 # many more statements like this except 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) 
3

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 logging try: assert False == True except AssertionError: logging.error("Nothing is real but I can't quit...", exc_info=True) 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like