Python When I catch an exception, how do I get the type, file, and line number?
捕获一个将按如下方式打印的异常:
1 2 3 4 | Traceback (most recent call last): File"c:/tmp.py", line 1, in <module> 4 / 0 ZeroDivisionError: integer division or modulo by zero |
我想把它格式化为:
1 | ZeroDivisonError, tmp.py, 1 |
1 2 3 4 5 6 7 8 | import sys, os try: raise NotImplementedError("No error") except Exception as e: exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] print(exc_type, fname, exc_tb.tb_lineno) |
simplest形式,为我工作。
1 2 3 4 5 6 | import traceback try: print(4/0) except ZeroDivisionError: print(traceback.format_exc()) |
输出
1 2 3 4 5 6 | Traceback (most recent call last): File"/path/to/file.py", line 51, in <module> print(4/0) ZeroDivisionError: division by zero Process finished with exit code 0 |
源(Py v2.7.3)traceback.format _例外(所谓的)和/ helps greatly相关函数。embarrassingly,总是忘记读《源代码。在我对这只母狗在搜索类似徒劳的细节。一个简单的问题,"如何recreate相同的输出作为Python例外的情况一样,与所有的细节。"这会让任何人90 +百分之二,不管他们的寻找。时滞,和这是IP的实例。希望它helps他人。(它的酸性帮我!;-)
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 32 33 34 35 36 37 38 39 40 41 42 43 44 | import sys, traceback traceback_template = '''Traceback (most recent call last): File"%(filename)s", line %(lineno)s, in %(name)s %(type)s: %(message)s ''' # Skipping the"actual line" item # Also note: we don't walk all the way through the frame stack in this example # see hg.python.org/cpython/file/8dffb76faacc/Lib/traceback.py#l280 # (Imagine if the 1/0, below, were replaced by a call to test() which did 1/0.) try: 1/0 except: # http://docs.python.org/2/library/sys.html#sys.exc_info exc_type, exc_value, exc_traceback = sys.exc_info() # most recent (if any) by default ''' Reason this _can_ be bad: If an (unhandled) exception happens AFTER this, or if we do not delete the labels on (not much) older versions of Py, the reference we created can linger. traceback.format_exc/print_exc do this very thing, BUT note this creates a temp scope within the function. ''' traceback_details = { 'filename': exc_traceback.tb_frame.f_code.co_filename, 'lineno' : exc_traceback.tb_lineno, 'name' : exc_traceback.tb_frame.f_code.co_name, 'type' : exc_type.__name__, 'message' : exc_value.message, # or see traceback._some_str() } del(exc_type, exc_value, exc_traceback) # So we don't leave our local labels/objects dangling # This still isn't"completely safe", though! #"Best (recommended) practice: replace all exc_type, exc_value, exc_traceback # with sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2] print traceback.format_exc() print traceback_template % traceback_details |
在这个特定的查询答案:
1 | sys.exc_info()[0].__name__, os.path.basename(sys.exc_info()[2].tb_frame.f_code.co_filename), sys.exc_info()[2].tb_lineno |
这里是一个example of the Line number of表现例外在需要的地方。
1 2 3 4 5 6 7 | import sys try: print(5/0) except Exception as e: print('Error on line {}'.format(sys.exc_info()[-1].tb_lineno), type(e).__name__, e) print('And the rest of program continues') |