raise from と例外チェーン

一言まとめ

except 内で raise X from e と書くと元例外が __cause__ に入り、偶然の連鎖ではなく因果であることを示せる。

作成 · 更新 · #python#exceptions

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 e

from None はチェーンを隠します。内部実装の例外を外に見せたくないときに使います。

try:
return self._cache[key]
except KeyError:
raise LookupError(key) from None

隠すと原因の追跡もできなくなるので、ライブラリの境界のように「中の都合を見せない」と決めた場所以外では素のままにしておく方が無難です。

更新履歴#

  • 2026-06-23: 初版(memos から移行)
  • 2026-10-09: タイトルを概念名に揃え、tags を補う

同じトピック — Python