Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで例外を別の型に変えて再スローする方法

Pythonで例外を別の型に変えて再スローする方法

Python 3.xでは、raise 新しい例外 from 元の例外 という構文を使うことで、捕捉した例外を別の種類の例外に変換して再スローできます。この際、元の例外は「原因」として自動的に連鎖(例外チェーン)され、トレースバックに出力されるため、デバッグ時に問題の発生源をたどりやすくなります。

基本的なコード例

次のコードでは、ZeroDivisionError を捕捉し、それを ValueError として再スローしています。

try:
    1/0
except ZeroDivisionError as e:
    raise ValueError("Sweet n Sour grapes") from e

実行結果

Python 3.xでは例外チェーンが機能するため、実行すると次のような出力が得られます。

Traceback (most recent call last):
  File "C:/Users/TutorialsPoint1/~.py", line 2, in <module>
    1/0
ZeroDivisionError: division by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:/Users/TutorialsPoint1/~.py", line 4, in <module>
    raise ValueError("Sweet n Sour grapes") from e
ValueError: Sweet n Sour grapes

最初に発生した ZeroDivisionError が表示された後、「The above exception was the direct cause of the following exception(上記の例外が、次の例外の直接の原因です)」というメッセージとともに、新しく発生した ValueError のトレースバックが出力されているのが分かります。

ポイント解説

  • from e を付けると明示的な連鎖になる: 元の例外が新しい例外の __cause__ 属性に記録され、トレースバックに両方の例外が表示されます。
  • from None で連鎖を抑制できる: 内部の詳細を隠したい場合は raise ValueError("エラー") from None と書くことで、新しい例外だけが表示されます。
  • from を省略した場合: exceptブロック内で発生した例外は、__context__ 属性を通じて暗黙的に連鎖されます。その場合もトレースバックには元の例外が表示されます。

このように raise ... from ... 構文を活用すれば、低レベルな例外をより意味のある独自の例外に変換しつつ、原因となった情報も失わずに扱うことができ、堅牢で保守性の高いエラーハンドリングを実現できます。

  1. Javaで例外を再スローする方法をわかりやすく解説

    Javaプログラミングでは、catchブロックで捕捉した例外を再度スロー(再スロー)する必要がある場面に出会うことがあります。たとえば、catchブロック側ではその例外を適切に処理できず、より上位の呼び出し元に処理を委ねたい場合などです。再スローを行うと、最初にスローされた例外オブジェクトがそのまま投げ直されます。ここで重要なのは、再スロー式が実行される時点で、その例外はすでに現在のスコープで捕捉済みであるという点です。そのため、再スローされた例外は現在のスコープ内のcatchブロックでは処理されず、一つ外側のtryブロックへと伝播していきます。そして、その外側のtryブロックに対応するcat

  2. PythonのBokehで画像を操作・表示する方法

    Pythonの可視化ライブラリBokehで画像を扱うには、image_url()メソッドを使い、画像URLのリストを渡すのが基本です。このメソッドを使うことで、ローカルやWeb上にある画像をプロット領域内に簡単に配置できます。実装の手順output_file()でデフォルトの出力先を設定し、show()を呼び出したときに結果がHTMLファイルとして保存されるようにします。figure()でプロット用の新しいFigure(図)オブジェクトを作成します。image_url()メソッドで、指定したURLから読み込んだ画像を描画します。show()を呼び出して、Bokehオブジェクトやアプリケーション