Python-如何在不停止程序的情况下打印完整的回溯?

我正在编写一个程序,该程序可以解析10个网站,找到数据文件,保存文件,然后解析它们以生成可以在NumPy库中轻松使用的数据。有万吨通过不良链接,不好的XML,缺项,其他的事情我还没有进行分类文件遇到错误的。我最初制作该程序来处理如下错误:

try:

do_stuff()

except:

pass

但是现在我想记录错误:

try:

do_stuff()

except Exception, err:

print Exception, err

请注意,这是打印到日志文件中以供以后查看。这通常会打印出非常无用的数据。我想要的是在错误触发时打印完全相同的行,而没有try-except拦截异常,但是我不希望它暂停我的程序,因为它嵌套在我想要的一系列for循环中看到完成。

回答:

其他一些答案已经指出了追溯模块。

请注意,使用print_exc,在某些特殊情况下,你将无法获得预期的结果。在Python 2.x中:

import traceback

try:

raise TypeError("Oups!")

except Exception, err:

try:

raise TypeError("Again !?!")

except:

pass

traceback.print_exc()

…将显示最后一个异常的回溯:

Traceback (most recent call last):

File "e.py", line 7, in <module>

raise TypeError("Again !?!")

TypeError: Again !?!

如果你确实需要访问原始的回溯,一种解决方案是将异常信息从exc_info本地变量中返回,并使用来显示它print_exception

import traceback

import sys

try:

raise TypeError("Oups!")

except Exception, err:

try:

exc_info = sys.exc_info()

# do you usefull stuff here

# (potentially raising an exception)

try:

raise TypeError("Again !?!")

except:

pass

# end of useful stuff

finally:

# Display the *original* exception

traceback.print_exception(*exc_info)

del exc_info

输出:

Traceback (most recent call last):

File "t.py", line 6, in <module>

raise TypeError("Oups!")

TypeError: Oups!

与此相关的一些陷阱:

从文档sys_info

在处理异常的函数中将回溯返回值分配给局部变量将导致循环引用。这将防止垃圾回收由同一函数中的局部变量或回溯引用的任何内容。[…] 如果确实需要回溯,请确保在使用后将其删除(最好通过try … finally语句完成)

但是,根据同一文档:

从Python 2.2开始,启用垃圾回收并且无法访问时,会自动回收此类循环,但是避免创建循环仍然更加有效。

另一方面,通过允许你访问与异常关联的回溯,Python 3产生了一个不太令人惊讶的结果:

import traceback

try:

raise TypeError("Oups!")

except Exception as err:

try:

raise TypeError("Again !?!")

except:

pass

traceback.print_tb(err.__traceback__)

…将显示:

  File "e3.py", line 4, in <module>

raise TypeError("Oups!")

以上是 Python-如何在不停止程序的情况下打印完整的回溯? 的全部内容, 来源链接: utcz.com/qa/404880.html

回到顶部