如何将traceback / sys.exc_info()值保存在variables中?
我想将错误的名称和回溯细节保存到一个variables中。 这是我的尝试。
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
PS我知道这可以很容易地使用回溯模块,但我想知道在这里sys.exc_info()[2]对象的用法。
这是我如何做到的:
>>> import traceback >>> try: ... int('k') ... except: ... var = traceback.format_exc() ... >>> print var Traceback (most recent call last): File "<stdin>", line 2, in <module> ValueError: invalid literal for int() with base 10: 'k'
你应该看看追溯文档 ,因为你可能会发现有更合适的方法,这取决于你想如何处理你的variables。
如果您想方便地访问模块和函数名称和行号,请使用traceback.extract_stack()
。
如果您只是想要一个看起来像traceback.print_stack()
输出的string,请使用''.join(traceback.format_stack())
。
请注意,即使使用''.join()
,也会得到一个多行string,因为format_stack()
的元素包含\n
。 见下面的输出。
记得import traceback
。
以下是traceback.extract_stack()
的输出。 格式添加为了可读性。
>>> traceback.extract_stack() [ ('<string>', 1, '<module>', None), ('C:\\Python\\lib\\idlelib\\run.py', 126, 'main', 'ret = method(*args, **kwargs)'), ('C:\\Python\\lib\\idlelib\\run.py', 353, 'runcode', 'exec(code, self.locals)'), ('<pyshell#1>', 1, '<module>', None) ]
这是''.join(traceback.format_stack())
的输出。 格式添加为了可读性。
>>> ''.join(traceback.format_stack()) ' File "<string>", line 1, in <module>\n File "C:\\Python\\lib\\idlelib\\run.py", line 126, in main\n ret = method(*args, **kwargs)\n File "C:\\Python\\lib\\idlelib\\run.py", line 353, in runcode\n exec(code, self.locals)\n File "<pyshell#2>", line 1, in <module>\n'
sys.exc_info()返回一个包含三个值(types,值,回溯)的元组。
- 这里types获取正在处理的exception的exceptiontypes
- 值是正被传递给exception类的构造函数的参数
- 回溯包含堆栈信息,例如发生exception的地方等
例如,在下面的程序中
try: a = 1/0 except Exception,e: exc_tuple = sys.exc_info()
现在,如果我们打印元组的值将是这个。
- exc_tuple [0]值将是“ ZeroDivisionError ”
- exc_tuple [1]的值将是“ 整除或模零 ”(作为parameter passing给exception类的string)
- exc_tuple [2]值将是“ (某些内存地址)的trackback对象 ”
以上的细节也可以通过以string格式打印exception来获取。
print str(e)
我对另一个问题的回答可能有助于说明细节 – 与链接! 对于jar头string,标准库追溯模块似乎没问题。 如果您想获得详细信息,请阅读源代码( <python install path>/Lib/traceback.py
)以获取更多信息。