Python exception handling - line number
我正在使用python来评估一些测量数据。由于许多可能的结果,很难处理或可能的组合。有时在评估过程中会发生错误。这通常是一个索引错误,因为我从测量数据中得到的数据超出了范围。
很难在代码中找出问题发生的位置。如果我知道错误是在哪一行出现的,那会有很大帮助。如果我使用以下代码:
1 2 3 4 5 | try: result = evaluateData(data) except Exception, err: print ("Error: %s. " % str(err)) |
不幸的是,这只告诉我存在和索引错误。我想知道关于异常的更多细节(代码中的行、变量等),以了解发生了什么。有可能吗?
谢谢您。
解决方案,打印文件名、行号、行本身和异常说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import linecache import sys def PrintException(): exc_type, exc_obj, tb = sys.exc_info() f = tb.tb_frame lineno = tb.tb_lineno filename = f.f_code.co_filename linecache.checkcache(filename) line = linecache.getline(filename, lineno, f.f_globals) print 'EXCEPTION IN ({}, LINE {}"{}"): {}'.format(filename, lineno, line.strip(), exc_obj) try: print 1/0 except: PrintException() |
输出:
1 | EXCEPTION IN (D:/Projects/delme3.py, LINE 15"print 1/0"): integer division or modulo by zero |
为了简单地得到您可以使用
1 2 3 4 5 | import sys try: [][2] except IndexError: print 'Error on line {}'.format(sys.exc_info()[-1].tb_lineno) |
印刷品:
1 | Error on line 3 |
来自
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import sys, traceback def lumberjack(): bright_side_of_death() def bright_side_of_death(): return tuple()[0] try: lumberjack() except IndexError: exc_type, exc_value, exc_traceback = sys.exc_info() print"*** print_tb:" traceback.print_tb(exc_traceback, limit=1, file=sys.stdout) print"*** print_exception:" traceback.print_exception(exc_type, exc_value, exc_traceback, limit=2, file=sys.stdout) print"*** print_exc:" traceback.print_exc() print"*** format_exc, first and last line:" formatted_lines = traceback.format_exc().splitlines() print formatted_lines[0] print formatted_lines[-1] print"*** format_exception:" print repr(traceback.format_exception(exc_type, exc_value, exc_traceback)) print"*** extract_tb:" print repr(traceback.extract_tb(exc_traceback)) print"*** format_tb:" print repr(traceback.format_tb(exc_traceback)) print"*** tb_lineno:", exc_traceback.tb_lineno |
最简单的方法就是使用:
1 2 3 4 5 | import traceback try: <blah> except IndexError: traceback.print_exc() |
或者如果使用日志记录:
1 2 3 4 5 | import logging try: <blah> except IndexError as e: logging.exception(e) |
我使用的EDOCX1[1]简单而健壮:
1 2 3 4 5 6 | import traceback try: raise ValueError() except: print(traceback.format_exc()) |
出:
1 2 3 4 | Traceback (most recent call last): File"catch.py", line 4, in <module> raise ValueError() ValueError |