gpt4 book ai didi

Python:消除库代码中的堆栈跟踪?

转载 作者:太空狗 更新时间:2023-10-29 21:27:36 27 4
gpt4 key购买 nike

当我从标准库中得到一个运行时异常时,它几乎总是我的代码中的问题,而不是库代码中的问题。有没有办法截断异常堆栈跟踪,使其不显示库包的内容?

例如,我想得到这个:

Traceback (most recent call last):
File "./lmd3-mkhead.py", line 71, in <module>
main()
File "./lmd3-mkhead.py", line 66, in main
create()
File "./lmd3-mkhead.py", line 41, in create
headver1[depotFile]=rev
TypeError: Data values must be of type string or None.

不是这个:

Traceback (most recent call last):
File "./lmd3-mkhead.py", line 71, in <module>
main()
File "./lmd3-mkhead.py", line 66, in main
create()
File "./lmd3-mkhead.py", line 41, in create
headver1[depotFile]=rev
File "/usr/anim/modsquad/oses/fc11/lib/python2.6/bsddb/__init__.py", line 276, in __setitem__
_DeadlockWrap(wrapF) # self.db[key] = value
File "/usr/anim/modsquad/oses/fc11/lib/python2.6/bsddb/dbutils.py", line 68, in DeadlockWrap
return function(*_args, **_kwargs)
File "/usr/anim/modsquad/oses/fc11/lib/python2.6/bsddb/__init__.py", line 275, in wrapF
self.db[key] = value
TypeError: Data values must be of type string or None.

更新: 添加了一个 answer有了代码,感谢 Alex 的指点。

最佳答案

traceback Python 标准库中的 module 允许您在传播异常时以您喜欢的方式发出错误回溯。您可以在 try/except 语句的 except 分支中或在安装为 sys.excepthook 的函数中使用此功能。 ,当异常一直传播时,它会被调用;引用文档:

In an interactive session this happens just before control is returned to the prompt; in a Python program this happens just before the program exits. The handling of such top-level exceptions can be customized by assigning another three-argument function to sys.excepthook.

这是一个简单的人工示例:

>>> import sys
>>> import traceback
>>> def f(n):
... if n<=0: raise ZeroDivisionError
... f(n-1)
...
>>> def excepthook(type, value, tb):
... traceback.print_exception(type, value, tb, 3)
...
>>> sys.excepthook = excepthook
>>> f(8)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in f
File "<stdin>", line 3, in f
ZeroDivisionError

如您所见,无需try/except,您可以轻松地将回溯限制在(例如)前三个级别——即使我们知道异常抛出时设计有9层嵌套。

你想要的东西比简单的级别限制更复杂,所以你需要调用 traceback.format_exception ,它给你一个行列表而不是打印它,然后从该列表中“删除”与你不想在回溯中看到的模块有关的行,最后发出剩余的行(通常到 sys.stderr ,但是,无论如何!-).

关于Python:消除库代码中的堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2615414/

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