gpt4 book ai didi

python - 如何将python回溯限制到特定文件

转载 作者:IT老高 更新时间:2023-10-28 22:09:28 27 4
gpt4 key购买 nike

我编写了很多使用外部库的 Python 代码。我经常会写一个错误,当我运行代码时,我会在 Python 控制台中得到很长的回溯。 99.999999% 的时间是由于我的代码中的编码错误,而不是因为包中的错误。但是回溯一直到包代码中的错误行,要么需要大量滚动回溯才能找到我编写的代码,要么回溯深入到我自己的代码没有的包中'甚至出现在回溯中。

有没有办法“黑盒”包代码,或者以某种方式只显示我的代码中的回溯行?我希望能够向系统指定我想从哪些目录或文件中查看回溯。

最佳答案

为了打印您自己的堆栈跟踪,您需要自己处理所有未处理的异常;这就是 sys.excepthook变得很方便。

这个函数的签名是sys.excepthook(type, value, traceback),它的工作是:

This function prints out a given traceback and exception to sys.stderr.

因此,只要您可以使用回溯并仅提取您关心的部分就可以了。测试框架经常这样做;它们有自定义的 assert 函数,这些函数通常不会出现在回溯中,换句话说,它们会跳过属于测试框架的帧。此外,在这些情况下,测试通常也由测试框架启动。

您最终会得到如下所示的回溯:

[自定义断言代码] + ... [被测代码] ... + [测试运行代码]

如何识别您的代码。

您可以在代码中添加一个全局变量:

__mycode = True

然后识别帧:

def is_mycode(tb):
globals = tb.tb_frame.f_globals
return globals.has_key('__mycode')

如何提取帧。

  1. 跳过对您不重要的框架(例如自定义断言代码)
  2. 确定代码中有多少帧 -> length
  3. 提取长度

    def mycode_traceback_levels(tb):
    length = 0
    while tb and is_mycode(tb):
    tb = tb.tb_next
    length += 1
    return length

示例处理程序。

def handle_exception(type, value, tb):
# 1. skip custom assert code, e.g.
# while tb and is_custom_assert_code(tb):
# tb = tb.tb_next
# 2. only display your code
length = mycode_traceback_levels(tb)
print ''.join(traceback.format_exception(type, value, tb, length))

安装处理程序:

sys.excepthook = handle_exception

接下来呢?

如果您仍然想要一些关于失败在您自己的代码之外的位置的信息,您可以调整 length 以添加一个或多个级别。

另见 https://gist.github.com/dnozay/b599a96dc2d8c69b84c6

关于python - 如何将python回溯限制到特定文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31949760/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com