これは、ジェネレーターでスローされた例外を処理するためのフォローアップであり、より一般的な問題について説明します。
さまざまな形式のデータを読み取る機能があります。すべてのフォーマットは行指向またはレコード指向であり、各フォーマットには、ジェネレーターとして実装された専用の解析機能があります。したがって、メインの読み取り関数は入力とジェネレーターを取得します。ジェネレーターは、入力からそれぞれの形式を読み取り、レコードをメイン関数に返します。
def read(stream, parsefunc):
for record in parsefunc(stream):
do_stuff(record)
parsefunc
次のようなものはどこにありますか?
def parsefunc(stream):
while not eof(stream):
rec = read_record(stream)
do some stuff
yield rec
私が直面している問題はparsefunc
、例外をスローすることはできますが(たとえば、ストリームから読み取る場合)、それを処理する方法がわからないことです。例外の処理を担当する関数がメインread
関数です。例外はレコードごとに発生するため、1つのレコードに障害が発生した場合でも、ジェネレータは作業を続行し、ストリーム全体が使い果たされるまでレコードを返す必要があることに注意してください。
next(parsefunc)
前の質問で私はブロックを入れようとしましたtry
が、結局のところ、これはうまくいきません。だから私はそれ自体に追加try-except
し、parsefunc
それからどういうわけか消費者に例外を提供しなければなりません:
def parsefunc(stream):
while not eof(stream):
try:
rec = read_record()
yield rec
except Exception as e:
?????
私はこれをするのはかなり気が進まないので
try
例外を処理することを目的としていない関数で使用することは意味がありません- 消費関数に例外を渡す方法がわかりません
- 多くのフォーマットと多く
parsefunc
の'がありますが、あまりにも多くのヘルパーコードでそれらを乱雑にしたくありません。
より良いアーキテクチャについて誰か提案がありますか?
グーグルへのメモ:トップアンサーに加えて、 senderleとJonの投稿に注意を払ってください-非常に賢くて洞察に満ちたものです。