2

例外をキャッチし、常に特定のコードを実行してから、元の例外を再発生させたいときに、これを実行していることに気付きます。

try:
    error = False
    # do something that *might* raise an exception
except Exception:
    error = True
finally:
    # something I *always* want to run
    if error:
        raise

raise前の例外なしで呼び出すと。が発生するため、フラグを使用していTypeErrorます。フラグなしで行うよりPythonicな方法はありますか?

4

2 に答える 2

9

例外ハンドラで例外を発生させます。

try:
    # do something that *might* raise an exception
except Exception:
    raise
finally:
    # something I *always* want to run

finallyスイートは、例外を再発生させたかどうかに関係なく、常に実行されます

ドキュメントから:

が存在する場合finallyは、「クリーンアップ」ハンドラーを指定します。tryanyexceptおよび句を含む句が実行されますelse。いずれかの句で例外が発生し、処理されない場合、例外は一時的に保存されます。finally句が実行されます。保存された例外がある場合は、finally句の最後で再発生します。

finallyスイートがbreakorreturnステートメントを使用する場合、保存された例外破棄されることに注意してください。

句がreturnまたはbreakステートメントを実行する場合finally、保存された例外は破棄されます。

def f():
    try:
        1/0
    finally:
        return 42

>>> f()
42

ただし、を発行した場合breakcontinueまたはスイートreturntryfinallyスイートは引き続き実行されます。

...ステートメントのスイートで、returnまたはbreakステートメントcontinueが実行されると、その句も「途中で」実行されます。</ p> trytryfinallyfinally

Python 2.5より前では、同じステートメントでexceptfinallyスイートを組み合わせることさえできなかったことに注意してください。PEP 341:統一された試行/例外/最終をtry参照してください。代わりに、ステートメントをネストすることが期待されていました。try

try:
    try:
        # some code that could raise an exception
    except SomeException:
        # exception handler
finally:
    # cleanup code, always executed
于 2013-03-25T20:21:00.743 に答える
2

finallyまたはブロックで何が起こっても、またはブロックが存在するかどうかに関係なく、常に実行されます。tryexceptexcept

これらは両方とも機能します。

try:
    # do something that *might* raise an exception
finally:
    # something I *always* want to run

 

try:
    # do something that *might* raise an exception
except Exception:
    raise
finally:
    # something I *always* want to run
于 2013-03-25T20:21:03.030 に答える