4

これを行うための「pythonic」な方法を見つけるのに苦労しています。同じtry-exceptパターンで異なるコード ブロックをキャッチする必要があります。キャッチするブロックはそれぞれ異なります。現在、コードのいくつかのポイントで、例外の長いリストを使用して、同じtry-exceptパターンを繰り返しています。

try:
    block to catch
except E1, e:
    log and do something
except E2, e:
    log and do something
...
except Exception, e:
    log and do something

with ステートメントコンテキスト マネージャーデコレーターを使用して、これを解決する良い方法があります。

from contextlib import contextmanager

@contextmanager
def error_handler():
    try:
        yield
    except E1, e:
        log and do something
    ...
    except Exception, e:
        log and do something


...
with error_handler():
    block to catch
...

しかし、ブロックに例外があったかどうかを知る必要がある場合はどうなりますか? つまり、前のwith ブロックtry-except-else のようなことを行う代替手段はありますか?

使用例:

for var in vars:
    try:
        block to catch
    except E1, e:
        log and do something
        # continue to the next loop iteration
    except E2, e:
        log and do something
        # continue to the next loop iteration
    ...
    except Exception, e:
        log and do something
        # continue to the next loop iteration
    else:
        do something else

同じtry-exceptパターンを何度も繰り返さないように、pythonicな方法でそのようなことをすることはできますか?

4

3 に答える 3

1

呼び出し元に例外なしの情報を返す方法がわかりません。エラー処理を別の関数に入れることしかできませんでした

def error_handler(exception):
    if isinstance(exception, E1):
        log and do something
    elif isinstance(exception, E2):
    ...
    else:
        log and do something

try:
    block to catch
except Exception, e:
    error_handler(e)
else:
    do something else
于 2014-05-01T09:45:35.873 に答える
0

基本的に、エラーを伝播させたいので、代わりに次のように言います。

def foo():
    try:
        something = xxx
    except ValueError as e:
        logging.warn("oh noes %s", e)
        return 42
    except IndexError as e:
        logging.warn("on no, not again %s", e)
        return 43

    go.on(something=something)

これはどう:

def foo():
    try:
        something = xxx
    except Exception:
        logging.exception("oh noes")
        return

    go.on(something=something)

そして、おそらく次のようにさらに単純化します。

def foo():
    go.on(something=xxx)

そして、呼び出し元にエラーを処理させます。

このアプローチは通常、Crash Earlyと呼ばれます。

于 2014-05-01T10:51:02.693 に答える