Ottieni il nome della classe a cui appartiene l'oggetto eccezione:
e.__class__.__name__
e usando la funzione print_exc () si stamperà anche la traccia dello stack che è informazione essenziale per qualsiasi messaggio di errore.
Come questo:
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!"
Otterrai un output in questo modo:
type is: CustomException
Traceback (most recent call last):
File "exc.py", line 7, in <module>
raise CustomException("hi")
CustomException: hi
E dopo la stampa e l'analisi, il codice può decidere di non gestire le eccezioni ed eseguire semplicemente 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"
Produzione:
special case of CustomException not interfering
E l'interprete stampa l'eccezione:
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
Dopo l' raise
eccezione originale continua a propagarsi ulteriormente nello stack di chiamate. ( Attenzione alle possibili insidie ) Se si solleva una nuova eccezione, si trascina una nuova traccia dello stack (più breve).
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"
Produzione:
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
Notare come il traceback non include la calculate()
funzione dalla riga 9
che è l'origine dell'eccezione originale e
.
except:
(senza uno bareraise
), tranne forse una volta per programma, e preferibilmente non allora.