Ho avuto bisogno di risolvere questo problema un paio di volte e mi sono imbattuto in questa domanda dopo una ricerca per quello che altre persone hanno fatto.
Un'opzione che richiede un po 'di refactoring potrebbe essere l'eccezione nel generatore (a un altro generatore di gestione degli errori) anziché nel generatore raise
. Ecco come potrebbe essere:
def read(handler):
# the handler argument fixes errors/problems separately
while something():
try:
yield something_else()
except Exception as e:
handler.throw(e)
handler.close()
def err_handler():
# a generator for processing errors
while True:
try:
yield
except Exception1:
handle_exc1()
except Exception2:
handle_exc2()
except Exception3:
handle_exc3()
except Exception:
raise
def process():
handler = err_handler()
for item in read(handler):
do stuff
Questa non è sempre la soluzione migliore, ma è sicuramente un'opzione.
EDIT:
Si potrebbe rendere il tutto un po 'più bello con un decoratore in questo modo (non ho ancora testato questo, ma dovrebbe funzionare, EDIT: non funziona, mi sistemerò in un secondo momento, ma il idea è valida):
def handled(handler):
"""
A decorator that applies error handling to a generator.
The handler argument received errors to be handled.
Example usage:
@handled(err_handler())
def gen_function():
yield the_things()
"""
def handled_inner(gen_f):
def wrapper(*args, **kwargs):
g = gen_f(*args, **kwargs)
while True:
try:
yield from g
except Exception as e:
handler.throw(e)
return wrapper
return handled_inner
@handled(err_handler())
def read():
while something():
yield something_else()
def process():
for item in read():
do stuff
fonte
2017-08-04 02:27:57
Grazie! Questo sembra essere il caso. Puoi dare un'occhiata alla domanda successiva: http://stackoverflow.com/q/11366892/989121? – georg