2011-11-23 72 views
66

我想将错误的名称和追溯详细信息保存到变量中。这是我的尝试。如何在一个变量中保存traceback/sys.exc_info()值?

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]对象在这里的用法。

+2

你可能误会了什么是你的程序怎么回事:你指的是什么为“sys.exc_info()[2]物体”追溯对象的实例(=您正在使用的追踪模块已经)。现在,您可以在不使用追踪模块中的辅助函数的情况下操作该对象,但这并不会改变您仍在使用它的事实。 :) – mac

+0

你试过打印sys.exc_info()[x] .__ str __()吗? – zmbq

+1

So @mac请帮助我使用或不使用辅助函数来访问此对象的值。 – codersofthedark

回答

96

这是我要做的事:

>>> 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' 

你应该然而看一看在​​3210,因为你可能会发现有更合适的方法,这取决于您要如何处理后您的变量...

+1

我正在寻找一种不使用追踪模块的方法。有没有办法打印这个对象引用的回溯细节? sys.exc_info()[2] – codersofthedark

+0

正确的,这就是为什么我认为我们可以做一些像sys.exc_info()[2] .format_exc(),但这不工作..因此,我不知道如何从中提取价值追溯对象sys.exc_info()[2]。任何想法? – codersofthedark

+0

@dragosrsupercool - “这就是为什么我认为我们可以做一些像sys.exc_info()[2] .format_exc()”这没有任何意义。你试图调用跟踪模块函数,就好像它是跟踪对象的方法一样... – mac

12

如果您想方便地访问模块和函数名称和行号,请​​使用traceback.extract_stack()

如果您只是想要一个看起来像traceback.print_stack()输出的字符串,请使用''.join(traceback.format_stack())

请注意,即使使用''.join(),您也将得到一个多行字符串,因为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' 
10

sys.exc_info()返回与三个值(类型,值,回溯)的元组。

  1. 以下类型获取异常的异常类型被处理
  2. 值是正在传递到异常类的构造函数的参数
  3. 回溯含有类似异常发生的位置等堆栈信息

对于实施例,在下面的程序

try: 

    a = 1/0 

except Exception,e: 

    exc_tuple = sys.exc_info() 

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

  1. exc_tuple [0]的值将是 “ZeroDivisionError
  2. exc_tuple [1]的值将是 “零整数除法或模”(字符串作为参数传递给异常类)
  3. exc_tuple [2]的值将是“在(某些存储器地址)引用对象

上述细节也可以通过简单地取出首席以字符串格式排除异常。

print str(e) 
相关问题