如何确保打印出失败的实际行而不包括整个回溯?追溯可能对我来说太长了,也无法打印出来。
此代码仅在函数a和b中打印错误,但我想看到函数d中发生的实际错误。
import traceback
def a():
try:
return b();
except:
print traceback.format_exc(2)
def b():
return c();
def c():
return d();
def d():
x = 1/0
a()
答案 0 :(得分:2)
您可以这样做:
import sys
import traceback
def a():
try:
return b();
except:
_, _, tb = sys.exc_info()
print traceback.format_list(traceback.extract_tb(tb)[-1:])[-1]
或者根据需要自行格式化字符串:
import sys
import traceback
def a():
try:
return b();
except:
_, _, tb = sys.exc_info()
filename, lineno, funname, line = traceback.extract_tb(tb)[-1]
print '{}:{}, in {}\n {}'.format(filename, lineno, funname, line)
此函数返回三个值的元组,提供有关当前正在处理的异常的信息(...) 如果堆栈中的任何位置都没有处理异常,则返回包含三个None值的元组。否则,返回的值是(type,value,traceback)。
返回从追溯对象追溯中提取的最多限制“预处理”堆栈跟踪条目的列表。它对堆栈跟踪的替代格式化很有用。如果省略limit或None,则提取所有条目。 “预处理”堆栈跟踪条目是四倍(文件名,行号,函数名称,文本),表示通常为堆栈跟踪打印的信息。文本是一个带有前导和尾随空格的字符串;如果源不可用则为None。
给定extract_tb()或extract_stack()返回的元组列表,返回准备打印的字符串列表。结果列表中的每个字符串对应于参数列表中具有相同索引的项。每个字符串以换行符结尾;对于那些源文本行不是None的项目,字符串也可以包含内部换行符。
答案 1 :(得分:0)
只需使用traceback.format_exc()
而不是traceback.format_exc(2)
。 format_exc
所采用的参数是要格式化的条目数的限制。如果不加说明,它们都会被格式化。
请注意,print traceback.format_exc()
也可以简单地写为traceback.print_exc()
答案 2 :(得分:0)
import traceback
如果您只想显示回溯:
print(traceback.format_exc())
如果要从回溯中提取诸如function_name,line_number,错误描述等值,则:
error_type, error, tb = sys.exc_info()
filename, lineno, func_name, line = traceback.extract_tb(tb)[-1]