我想将错误的名称和回溯细节保存到一个变量中。这是我的尝试。
import sys
try:
try:
print x
except Exception, ex:
raise NameError
except Exception, er:
print "0", sys.exc_info()[0]
print "1", sys.exc_info()[1]
print "2", sys.exc_info()[2]
输出:
0 <type 'exceptions.NameError'>
1
2 <traceback object at 0xbd5fc8>
期望输出:
0 NameError
1
2 Traceback (most recent call last):
File "exception.py", line 6, in <module>
raise NameError
P.S.我知道使用traceback模块可以很容易地做到这一点,但我想知道sys.exc_info()[2]对象的用法。
5条答案
按热度按时间xoshrz7s1#
我是这么做的
但是,你应该看看traceback documentation,因为你可能会发现更合适的方法,这取决于你想如何处理你的变量。
6pp0gazn2#
exc_info()返回一个包含三个值(type、value、traceback)的元组。
1.这里type获取正在处理的Exception的异常类型
1.value是传递给异常类构造函数的参数
例如,在以下程序中
现在如果我们打印元组,值将是这样的。
上述细节也可以通过简单地以字符串格式打印异常来获取。
bkkx9g8r3#
如果您希望方便地访问模块和函数名称以及行号,请使用
traceback.extract_stack()
。如果您只想要一个看起来像
traceback.print_stack()
输出的字符串,请使用''.join(traceback.format_stack())
。请注意,即使使用
''.join()
,您也会得到一个多行字符串,因为format_stack()
的元素包含\n
。见以下输出。记住
import traceback
。下面是
traceback.extract_stack()
的输出。为可读性添加了格式。下面是
''.join(traceback.format_stack())
的输出。为可读性添加了格式。7fyelxc54#
从异常处理程序中取出异常对象或回溯对象时要小心,因为这会导致循环引用,
gc.collect()
将无法收集。在ipython/jupyter notebook环境中,这似乎是一个特殊的问题,在那里traceback对象不能在正确的时间被清除,甚至在finally
节中显式调用gc.collect()
也没有任何作用。如果你有一些巨大的对象,它们的内存没有被回收,这是一个很大的问题。CUDA内存不足异常(不使用此解决方案需要完全重启内核才能恢复)。一般来说,如果你想保存traceback对象,你需要清除它对
locals()
的引用,如下所示:在jupyter notebook的情况下,你至少要在异常处理程序中做到这一点:
使用Python 3.7测试。
ipython或jupyter notebook env的问题是它有
%tb
魔法,可以保存回溯,并使其在以后的任何时候都可用。因此,参与回溯的所有帧中的任何locals()
都不会被释放,直到notebook退出或另一个异常将覆盖先前存储的回溯。这是非常有问题的。它不应存储回溯而不清理其帧。修复提交的here。gojuced75#
该对象可以用作
Exception.with_traceback()
函数中的参数: