vorrei farlo in un modo simile stai pensando di, utilizzando il 'tu non passerai' Gandalf gestore di eccezioni except Exception
to catch all non-system-exiting exceptions durante la creazione di una lista nera set
di eccezioni che dovrebbero passare e terminare nuovamente.
Come una piccola dimostrazione:
import exceptions # Py2.x only
# dictionary holding {exception_name: exception_class}
excptDict = vars(exceptions)
exceptionNames = ['MemoryError', 'OSError', 'SystemError'] # and others
# set containing black-listed exceptions
blackSet = {excptDict[exception] for exception in exceptionNames}
Ora blackSet = {OSError, SystemError, MemoryError}
tenendo le classi del non-sistema-uscendo eccezioni che vogliamo non maniglia.
Un try-except
blocco può apparire così:
try:
# calls that raise exceptions:
except Exception as e:
if type(e) in blackSet: raise e # re-raise
# else just handle it
Un esempio che cattura tutte le eccezioni che utilizzano BaseException
può aiutare a illustrare quello che voglio dire. (Questo è fatto a scopo dimostrativo solo, al fine di vedere come questa raccolta finirà per terminare il programma).Nota: Sono non suggerendo di utilizzare BaseException
; Lo sto usando al fine di dimostrare la quello eccezione sarà effettivamente 'passare attraverso' e causare la terminazione (vale a dire tutto ciò che BaseException
catture):
for i, j in excptDict.iteritems():
if i.startswith('__'): continue # __doc__ and other dunders
try:
try:
raise j
except Exception as ex:
# print "Handler 'Exception' caught " + str(i)
if type(ex) in blackSet:
raise ex
except BaseException:
print "Handler 'BaseException' caught " + str(i)
# prints exceptions that would cause the system to exit
Handler 'BaseException' caught GeneratorExit
Handler 'BaseException' caught OSError
Handler 'BaseException' caught SystemExit
Handler 'BaseException' caught SystemError
Handler 'BaseException' caught KeyboardInterrupt
Handler 'BaseException' caught MemoryError
Handler 'BaseException' caught BaseException
Infine, al fine di rendere questo Python 2/3 agnostici , è possibile try
e import exceptions
e se ciò non riesce (cosa che fa in Python 3), fall-back per importare builtins
che contiene tutto Exceptions
; si cerca il dizionario dal nome in modo non fa alcuna differenza:
try:
import exceptions
excDict = vars(exceptions)
except ImportError:
import builtins
excDict = vars(builtins)
Non so se c'è un modo più intelligente di fare effettivamente questa, un'altra soluzione potrebbe essere, invece di avere un try-except
con un signle except
, avendo 2 gestori, uno per le eccezioni black list e l'altro per il caso generale:
try:
# calls that raise exceptions:
except tuple(blackSet) as be: # Must go first, of course.
raise be
except Exception as e:
# handle the rest
Questo potrebbe anche essere utile per decidere quale delle 'Exception's da gestire: gerarchia delle eccezioni incorporate: https://docs.python.org/3.5/library/exceptions.html#exception-hierarchy – Timur