5

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

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

3 回答 3

4

你可以这样做:

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 值的元组。否则,返回的值为(类型、值、回溯)。

返回从回溯对象回溯中提取的最多限制“预处理”堆栈跟踪条目的列表。它对于堆栈跟踪的替代格式很有用。如果省略限制或无,则提取所有条目。“预处理”堆栈跟踪条目是一个四元组(文件名、行号、函数名、文本),表示通常为堆栈跟踪打印的信息。文本是一个去掉了前导和尾随空格的字符串;如果源不可用,则为无。

给定由 extract_tb() 或 extract_stack() 返回的元组列表,返回准备打印的字符串列表。结果列表中的每个字符串对应于参数列表中具有相同索引的项。每个字符串都以换行符结尾;对于源文本行不是 None 的项目,字符串也可能包含内部换行符。

于 2013-08-22T12:19:47.067 回答
0

只需使用traceback.format_exc()而不是traceback.format_exc(2). 采用的参数format_exc是要格式化的条目数的限制。如果你把它排除在外,它们都会被格式化。

注意print traceback.format_exc()也可以简单地写成traceback.print_exc()

于 2019-02-27T14:49:31.960 回答
0
import traceback

如果您只想显示回溯:

print(traceback.format_exc())

如果您想从回溯中提取函数名、行号、错误描述等值:

error_type, error, tb = sys.exc_info()
filename, lineno, func_name, line = traceback.extract_tb(tb)[-1]
于 2020-04-07T18:21:09.703 回答