4.2 例外

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

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

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

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

例外は、クラスインスタンスによって識別されます。 except 節はインスタンスのクラスにもとづいて選択されます: これはインスタンスのクラスか、そのベースクラスを参照します。この インスタンスはハンドラによって受け取られ、例外条件に関する追加情報を 伝えることができます。

例外は文字列 (strings) によっても識別することができ、このような場合には except 節はオブジェクトの同一性によって選択されます。 任意の値をハンドラに渡される識別文字列に伴って送出することができます。

リリース 2.5 で撤廃されました。 文字列の例外は新規のコードでは使うべきではありません。 これは Python の将来のバージョンではサポートされないでしょう。 古いコードは代わりにクラスによる例外を使うように書き直すべきです。

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

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

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。