validar try tipos sirve sintaxis que por para invalid excepción excepciones error ejemplos diferentes python exception exception-handling traceback

try - tipos de excepción en python



Cómo obtener un seguimiento completo de la pila de excepciones en Python (4)

Aquí hay una función basada en esta respuesta . También funcionará cuando no haya ninguna excepción presente:

def full_stack(): import traceback, sys exc = sys.exc_info()[0] stack = traceback.extract_stack()[:-1] # last one would be full_stack() if not exc is None: # i.e. if an exception is present del stack[-1] # remove call of full_stack, the printed exception # will contain the caught exception caller instead trc = ''Traceback (most recent call last):/n'' stackstr = trc + ''''.join(traceback.format_list(stack)) if not exc is None: stackstr += '' '' + traceback.format_exc().lstrip(trc) return stackstr

print full_stack() imprimirá la traza completa de la pila hasta la parte superior, incluidas, por ejemplo, interactiveshell.py llamadas interactiveshell.py de IPython, ya que no hay (a mi entender) ninguna forma de saber quién detectaría excepciones. Probablemente no vale la pena descubrirlo de todos modos ...

Si se print full_stack() desde dentro de un bloque except , full_stack incluirá el seguimiento de la pila hasta la raise . En el intérprete de Python estándar, esto será idéntico al mensaje que recibirás cuando no se detecte la excepción (por eso es que del stack[-1] está ahí, no te importa el bloque except sino el bloque try ).

El siguiente fragmento de código:

import traceback def a(): b() def b(): try: c() except: traceback.print_exc() def c(): assert False a()

Produce esta salida:

Traceback (most recent call last): File "test.py", line 8, in b c() File "test.py", line 13, in c assert False AssertionError

¿Qué debo usar si quiero el seguimiento completo de la pila, incluida la llamada a un?

Si importa tengo Python 2.6.6

edición: lo que me gustaría obtener es la misma información que obtendría si dejara el intento, excepto que salga y deje que la excepción se propague al nivel superior. Este fragmento de código, por ejemplo:

def a(): b() def b(): c() def c(): assert False a()

Produce esta salida:

Traceback (most recent call last): File "test.py", line 10, in <module> a() File "test.py", line 2, in a b() File "test.py", line 5, in b c() File "test.py", line 8, in c assert False AssertionError


No sé si hay una mejor manera, pero esto es lo que hice:

import traceback import sys def format_exception(e): exception_list = traceback.format_stack() exception_list = exception_list[:-2] exception_list.extend(traceback.format_tb(sys.exc_info()[2])) exception_list.extend(traceback.format_exception_only(sys.exc_info()[0], sys.exc_info()[1])) exception_str = "Traceback (most recent call last):/n" exception_str += "".join(exception_list) # Removing the last /n exception_str = exception_str[:-1] return exception_str def main1(): main2() def main2(): try: main3() except Exception as e: print "Printing only the traceback above the current stack frame" print "".join(traceback.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2])) print print "Printing the full traceback as if we had not caught it here..." print format_exception(e) def main3(): raise Exception() if __name__ == ''__main__'': main1()

Y aquí está la salida que obtengo:

Printing only the traceback above the current stack frame Traceback (most recent call last): File "exc.py", line 22, in main2 main3() File "exc.py", line 31, in main3 raise Exception() Exception Printing the full traceback as if we had not caught it here... Traceback (most recent call last): File "exc.py", line 34, in <module> main1() File "exc.py", line 18, in main1 main2() File "exc.py", line 22, in main2 main3() File "exc.py", line 31, in main3 raise Exception() Exception




Aquí hay una variante un poco mejor de la respuesta de Tobias Kienzler . Funciona igual, pero puede llamarse no en el derecho except en el bloque, pero en algún lugar más profundo. En otras palabras, esta variante imprimirá las mismas pilas, cuando se llame como

try: ... except Exception: print full_stack()

o

def print_full_stack(): print full_stack() try: ... except Exception: print_full_stack()

Aquí está el código:

def full_stack(): import traceback, sys exc = sys.exc_info()[0] if exc is not None: f = sys.exc_info()[-1].tb_frame.f_back stack = traceback.extract_stack(f) else: stack = traceback.extract_stack()[:-1] # last one would be full_stack() trc = ''Traceback (most recent call last):/n'' stackstr = trc + ''''.join(traceback.format_list(stack)) if exc is not None: stackstr += '' '' + traceback.format_exc().lstrip(trc) return stackstr