捕获一个将按如下方式打印的异常:
Traceback (most recent call last):
File"c:/tmp.py", line 1, in
4 / 0
ZeroDivisionError: integer division or modulo by zero
我想把它格式化为:
ZeroDivisonError, tmp.py, 1
使用内置的回溯模块。
如果出现异常,打印代码行也会有所帮助:请参阅stackoverflow.com/questions/14519177/…
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)
您应该小心地将sys.exc_info()解包到局部变量中,因为如果在except处理程序中得到异常,则局部变量可以保存在循环引用中,而不是gc'd中。最佳做法是始终只使用sys.exc_info()的切片。或者像其他海报建议的那样使用其他模块,比如回溯。
肺结核只是不包括肺结核吗?和os.path.split(blabla)[1]是os.path.basename(balbalbal)
这条线安全吗?
用这个代码,我得到(当try: 1/0时):integer division or modulo by zero。如何让ZeroDivisionError: integer division or modulo by zero代替?
@basj:使用sys.exc_info()[0]。uu name_uuu,您可以得到类型的简单名称。
@DanielPryden python文档也使用相同的解包方法docs.python.org/2/library/traceback.html回溯示例
我正在从另一个文件导入类,使用此解决方案时,错误指向当前文件中调用该类函数的行。实际错误发生在类文件中,但此解决方案仅显示当前文件中的错误。有没有办法挖得更深?
@罗布:是的,它是安全的。为了解决以前API中的线程安全问题,引入了sys.exc_info()。它的输出特定于当前线程和当前堆栈帧。
如果使用日志库,则使用logging.exception(e)
这是一个很好的演示,演示了为什么在Python中所有简单的事情都比较困难……
simplest形式,为我工作。
import traceback
try:
print(4/0)
except ZeroDivisionError:
print(traceback.format_exc())
输出
Traceback (most recent call last):
File"/path/to/file.py", line 51, in
print(4/0)
ZeroDivisionError: division by zero
Process finished with exit code 0
虽然这不完全是OP想要的格式,但这是最简单、最可靠的解决方案。
它的强大之处是什么?
这正是我想要的。""稳健"。
源(Py v2.7.3)traceback.format _例外(所谓的)和/ helps greatly相关函数。embarrassingly,总是忘记读《源代码。在我对这只母狗在搜索类似徒劳的细节。一个简单的问题,"如何recreate相同的输出作为Python例外的情况一样,与所有的细节。"这会让任何人90 +百分之二,不管他们的寻找。时滞,和这是IP的实例。希望它helps他人。(它的酸性帮我!;-)
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
print traceback.format_exc()
print
print traceback_template % traceback_details
print
在这个特定的查询答案:
sys.exc_info()[0].__name__, os.path.basename(sys.exc_info()[2].tb_frame.f_code.co_filename), sys.exc_info()[2].tb_lineno
PY3改'message' : exc_value.message为'message' : str(exc_value)。
这里是一个example of the Line number of表现例外在需要的地方。
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')