1つを除くすべての例外を処理する方法は?
try:
something
except <any Exception except for a NoChildException>:
# handling
元のトレースバックを破棄しないことを除いて、このようなもの:
try:
something
except NoChildException:
raise NoChildException
except Exception:
# handling
答えは、単純にraise
を実行することです。
try:
...
except NoChildException:
# optionally, do some stuff here and then ...
raise
except Exception:
# handling
これにより、最後にスローされた例外が再発生し、元のスタックトレースはそのままになります(処理された場合でも!)。
受け入れられた答えの改善としてこれを提供したいと思います。
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がキャッチされたときに元のスタックトレースを維持することにより、受け入れられた回答を改善します。したがって、最上位の例外ハンドラーが例外をログに記録すると、元の例外がスローされた場所を指すトレースバックが取得されます。