raise from と例外チェーン
一言まとめ
except 内で raise X from e と書くと元例外が __cause__ に入り、偶然の連鎖ではなく因果であることを示せる。
except の中で別の例外を投げると、Python は元の例外を __context__ に暗黙で繋ぎます。トレースバックに出る「During handling of the above exception, another exception occurred」がこれです。処理中にたまたま別の例外が起きた、という意味になります。
raise X from e を書くと __cause__ に入り、表示が「The above exception was the direct cause of the following exception」に変わります。偶然ではなく因果だ、という宣言です。
try: port = int(raw)except ValueError as e: raise ConfigError(f"invalid port: {raw!r}") from efrom None はチェーンを隠します。内部実装の例外を外に見せたくないときに使います。
try: return self._cache[key]except KeyError: raise LookupError(key) from None隠すと原因の追跡もできなくなるので、ライブラリの境界のように「中の都合を見せない」と決めた場所以外では素のままにしておく方が無難です。
更新履歴
- 2026-06-23: 初版(memos から移行)
- 2026-10-09: タイトルを概念名に揃え、tags を補う