Python回溯,显示错误发生的行,即使没有显示完整的回溯

时间:2013-08-22 12:09:49

标签: python error-handling

如何确保打印出失败的实际行而不包括整个回溯?追溯可能对我来说太长了,也无法打印出来。

此代码仅在函数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()

3 个答案:

答案 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]