Obtenga el nombre de la clase a la que pertenece el objeto de excepción:
e.__class__.__name__
y el uso de la función print_exc () también imprimirá el seguimiento de la pila, que es información esencial para cualquier mensaje de error.
Me gusta esto:
from traceback import print_exc
class CustomException(Exception): pass
try:
raise CustomException("hi")
except Exception, e:
print 'type is:', e.__class__.__name__
print_exc()
# print "exception happened!"
Obtendrá una salida como esta:
type is: CustomException
Traceback (most recent call last):
File "exc.py", line 7, in <module>
raise CustomException("hi")
CustomException: hi
Y después de la impresión y el análisis, el código puede decidir no manejar excepciones y simplemente ejecutar raise
:
from traceback import print_exc
class CustomException(Exception): pass
def calculate():
raise CustomException("hi")
try:
calculate()
except Exception, e:
if e.__class__ == CustomException:
print 'special case of', e.__class__.__name__, 'not interfering'
raise
print "handling exception"
Salida:
special case of CustomException not interfering
Y el intérprete imprime la excepción:
Traceback (most recent call last):
File "test.py", line 9, in <module>
calculate()
File "test.py", line 6, in calculate
raise CustomException("hi")
__main__.CustomException: hi
Después de que la raise
excepción original continúa propagándose más arriba en la pila de llamadas. ( Tenga cuidado con las posibles dificultades ) Si genera una nueva excepción, conlleva un nuevo seguimiento de pila (más corto).
from traceback import print_exc
class CustomException(Exception): pass
def calculate():
raise CustomException("hi")
try:
calculate()
except Exception, e:
if e.__class__ == CustomException:
print 'special case of', e.__class__.__name__, 'not interfering'
#raise CustomException(e.message)
raise e
print "handling exception"
Salida:
special case of CustomException not interfering
Traceback (most recent call last):
File "test.py", line 13, in <module>
raise CustomException(e.message)
__main__.CustomException: hi
Observe cómo el rastreo no incluye la calculate()
función de la línea, 9
que es el origen de la excepción original e
.
except:
(sin bareraise
), excepto tal vez una vez por programa, y preferiblemente no entonces.