web-dev-qa-db-ja.com

1つを除くすべての例外の処理

1つを除くすべての例外を処理する方法は?

try:
    something
except <any Exception except for a NoChildException>:
    # handling

元のトレースバックを破棄しないことを除いて、このようなもの:

try:
    something
except NoChildException:
    raise NoChildException
except Exception:
    # handling
29
Ivan Vulović

答えは、単純にraiseを実行することです。

try:
    ...
except NoChildException:
    # optionally, do some stuff here and then ...
    raise
except Exception:
    # handling

これにより、最後にスローされた例外が再発生し、元のスタックトレースはそのままになります(処理された場合でも!)。

40
Gareth Latty

受け入れられた答えの改善としてこれを提供したいと思います。

try:
    dosomestuff()
except MySpecialException:
    ttype, value, traceback = sys.exc_info()
    raise ttype, value, traceback
except Exception as e:
    mse = convert_to_myspecialexception_with_local_context(e, context)
    raise mse

このアプローチは、MySpecialExceptionがキャッチされたときに元のスタックトレースを維持することにより、受け入れられた回答を改善します。したがって、最上位の例外ハンドラーが例外をログに記録すると、元の例外がスローされた場所を指すトレースバックが取得されます。

1