2011-11-23 19 views
66

Quiero guardar el nombre del error y los detalles de seguimiento en una variable. Aquí está mi intento.¿Cómo guardar los valores de traceback/sys.exc_info() en una variable?

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] 

Salida:

0 <type 'exceptions.NameError'> 
1 
2 <traceback object at 0xbd5fc8> 

salida deseada:

0 NameError 
1 
2 Traceback (most recent call last): 
    File "exception.py", line 6, in <module> 
    raise NameError 

P. S. Sé que esto se puede hacer fácilmente usando el módulo de rastreo, pero quiero saber aquí el uso del objeto sys.exc_info() [2].

+2

Es posible que haya entendido mal lo que está pasando en su programa: lo que se refieren como "sys.exc_info() [2] objeto" es una instancia del objeto de rastreo (= que está utilizando el módulo de rastreo ya) Ahora puede manipular ese objeto sin utilizar las funciones auxiliares en el módulo de rastreo, pero eso no cambia el hecho de que todavía lo está utilizando. :) – mac

+0

¿Ha intentado imprimir sys.exc_info() [x] .__ str __()? – zmbq

+1

Así que @mac por favor ayúdame a usar el acceso al valor de este objeto con o sin usar la función auxiliar. – codersofthedark

Respuesta

96

Así es como lo hago:

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

Usted debe sin embargo echar un vistazo a la traceback documentation, como se puede encontrar que hay métodos más adecuados, en función de cómo desea procesar la variable después ...

+1

Estaba buscando un método sin usar el módulo de rastreo. ¿De alguna manera podemos simplemente imprimir detalles de rastreo de esta referencia de objeto? sys.exc_info() [2] – codersofthedark

+0

Correcto, es por eso que pensé que podíamos hacer algo como sys.exc_info() [2] .format_exc(), pero esto no funciona ... Por lo tanto, me pregunto cómo puedo extraer valor de objeto de rastreo sys.exc_info() [2]. ¿Alguna idea? – codersofthedark

+0

@dragosrsupercool - "es por eso que pensé que podíamos hacer algo como sys.exc_info() [2] .format_exc()" que no tiene sentido. Está intentando llamar a una función de módulo de rastreo como si fuera un método del objeto de rastreo ... – mac

1

Mi answer a otra pregunta puede ayudar a ilustrar los detalles - ¡con enlaces! Para cadenas enlatadas, el módulo de rastreo de biblioteca estándar parece estar bien. Si desea obtener los detalles, lea la fuente (<python install path>/Lib/traceback.py) para obtener más información.

12

Utilice traceback.extract_stack() si desea un acceso conveniente a los nombres de módulos y funciones y los números de línea.

Use ''.join(traceback.format_stack()) si solo quiere una cadena que se parece a la salida traceback.print_stack().

Observe que incluso con ''.join() obtendrá una cadena de varias líneas, ya que los elementos de format_stack() contienen . Ver salida a continuación.

Recuerde import traceback.

Aquí está la salida de traceback.extract_stack(). Formateo agregado para legibilidad.

>>> 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) 
] 

Aquí está la salida de ''.join(traceback.format_stack()). Formateo agregado para legibilidad.

>>> ''.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() devuelve una tupla con tres valores (tipo, valor, rastreo).

  1. Aquí tipo Obtiene el tipo de excepción de la excepción siendo manejado valor
  2. son los argumentos que se pasan al constructor de la clase de excepción
  3. rastreo contiene la información de la pila como donde ocurrió la excepción etc.

Por ejemplo, en el siguiente programa

try: 

    a = 1/0 

except Exception,e: 

    exc_tuple = sys.exc_info() 

Ahora si imprimimos la tupla los valores serán los siguientes.

  1. exc_tuple [0] valor será "ZeroDivisionError"
  2. exc_tuple [1] valor serán "división de enteros o de módulo por cero" (String pasa como parámetro a la clase de excepción)
  3. exc_tuple [2] valor serán "objeto del vínculo de referencia en (algunos dirección de memoria)"

Los detalles anteriores también se pueden traer simplemente Prin ting la excepción en formato de cadena.

print str(e) 
Cuestiones relacionadas