例外とは、コードブロックの通常の制御フローを中断して、 エラーやその他の例外的な状況を処理できるようにするための 手段です。 例外はエラーが検出された時点で 送出 (raise) されます; 例外は、エラーが発生部の周辺のコードブロックか、エラーが発生した コードブロック直接または間接的に呼び出しているコードブロック で 処理 (handle) することが できます。
Python インタプリタは、ランタイムエラー (ゼロによる除算など) が 検出されると例外を送出します。Python プログラムから、raise 文を使って明示的に例外を送出することもできます。 例外ハンドラ (exception handler) は、 try ... except 文で指定することができます。try ... finally 節を使うとクリーンアップコード (cleanup code) を指定できます。 このコードは例外は処理しませんが、先行するコードブロックで例外が 起きても起きなくても実行されます。
Python は、エラー処理に ``プログラムの終了 (termination)'' モデルを用いています: 例外ハンドラは、 プログラムに何が発生したかを把握することができ、ハンドラの外側の レベルに処理を継続することはできますが、(問題のあったコード部分を 最初から実行しなおすのでない限り) エラーの原因を修復したり、 実行に失敗した操作をやり直すことはできません。
例外が全く処理されない場合、インタプリタはプログラムの実行を終了させる か、対話メインループに処理を戻します。どちらの場合も、 例外が SystemExitでない限りバックトレース (backtrace) を出力します。
例外は、クラスインスタンスとして識別されます。 ある例外にどの except 節が一致するかの選択は、オブジェクトの アイデンティティに基づいて行われます。 except 節は、同じクラスの例外か、基底クラスの例外 しか参照しません。
例外が発行されると、オブジェクト (None
になることもあります)
が例外の 値 (value) として渡されます; このオブジェクトが
例外ハンドラの選択自体に影響することはありませんが、選択された例外
ハンドラに付帯情報として渡されます。
例外がクラスの場合、オブジェクトは送出された例外クラスのインスタンス
でなければなりません。