如何将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,值,回溯)的元组。

  1. 这里types获取正在处理的exception的exceptiontypes
  2. 值是正被传递给exception类的构造函数的参数
  3. 回溯包含堆栈信息,例如发生exception的地方等

例如,在下面的程序中

 try: a = 1/0 except Exception,e: exc_tuple = sys.exc_info() 

现在,如果我们打印元组的值将是这个。

  1. exc_tuple [0]值将是“ ZeroDivisionError
  2. exc_tuple [1]的值将是“ 整除或模零 ”(作为parameter passing给exception类的string)
  3. exc_tuple [2]值将是“ (某些内存地址)的trackback对象

以上的细节也可以通过以string格式打印exception来获取。

 print str(e) 

我对另一个问题的回答可能有助于说明细节 – 与链接! 对于jar头string,标准库追溯模块似乎没问题。 如果您想获得详细信息,请阅读源代码( <python install path>/Lib/traceback.py )以获取更多信息。