#
4.2 例外

例外とは、コードブロックの通常の制御フローを中断して、 エラーやその他の例外的な状況を処理できるようにするための 手段です。 例外はエラーが検出された時点で 送出 (raise) されます; 例外は、エラーが発生部の周辺のコードブロックか、エラーが発生した コードブロック直接または間接的に呼び出しているコードブロック で 処理 (handle) することが できます。

Python インタプリタは、ランタイムエラー (ゼロによる除算など) が 検出されると例外を送出します。Python プログラムから、`raise` 文を使って明示的に例外を送出することもできます。 例外ハンドラ (exception handler) は、 `try` ... `except` 文で指定することができます。`try` ... `finally` 節を使うとクリーンアップコード (cleanup code) を指定できます。 このコードは例外は処理しませんが、先行するコードブロックで例外が 起きても起きなくても実行されます。

Python は、エラー処理に ``プログラムの終了 (termination)'' モデルを用いています: 例外ハンドラは、 プログラムに何が発生したかを把握することができ、ハンドラの外側の レベルに処理を継続することはできますが、(問題のあったコード部分を 最初から実行しなおすのでない限り) エラーの原因を修復したり、 実行に失敗した操作をやり直すことはできません。

例外が全く処理されない場合、インタプリタはプログラムの実行を終了させる か、対話メインループに処理を戻します。どちらの場合も、 例外が `SystemExit` でない限りバックトレース (backtrace) を出力します。

例外は、クラスインスタンスとして識別されます。 ある例外にどの except 節が一致するかの選択は、オブジェクトの アイデンティティに基づいて行われます。 `except` 節は、同じクラスの例外か、基底クラスの例外 しか参照しません。

例外が発行されると、オブジェクト (`None` になることもあります) が例外の 値 (value) として渡されます; このオブジェクトが 例外ハンドラの選択自体に影響することはありませんが、選択された例外 ハンドラに付帯情報として渡されます。 例外がクラスの場合、オブジェクトは送出された例外クラスのインスタンス でなければなりません。

警告: 例外に対するメッセージは、Python API 仕様には含まれていません。 メッセージの内容は、ある Python のバージョンから次のバージョンに なるときに、警告なしに変更される可能性があります。したがって、 複数バージョンのインタプリタで動作するようなコードにおいては、 例外メッセージの内容に依存した記述をすべきではありません。

`try` 文については、 7.4 節、 `raise` 文については 6.9 節も参照してください。