私はこの問題を数回解決する必要があり、他の人が何をしているのかを探してからこの質問を受けました。
リファクタリングを少し必要とするオプションは、raise
ではなく、(別のエラー処理ジェネレータの)ジェネレータの例外であるthrow
になります。これは、次のようになります。
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
これは必ずしも最良の解決策になるとは限りませんが、確かに選択肢です。
EDIT:
あなたはデコレータと少しだけよりよいそれをすべてこの方法を作る(私はこれをテストしていませんが、それは動作するはず、EDITができます動作しない、私は後でそれを修正しますが、アイデアは健全です):
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
ありがとう!これはそのように見えます。あなたは、フォローアップの質問を見てみることができます:http://stackoverflow.com/q/11366892/989121? – georg