2.2 組み込み例外

 

例外はクラスオブジェクトまたは文字列オブジェクトです。 伝統的に、大抵の例外は文字列オブジェクトでしたが、パイソン1.5では すべての標準例外はクラスオブジェクトに変換されました。そしてユーザ定義例外も同じようにすることが推奨されています。 これらの例外に対するソースコードは標準ライブラリモジュールexceptions内にあります。このモジュールを明示的にインポートする必要はありません。

以前のバージョンとの互換性維持のために、-Xオプションでパイソンが呼び出されたときには、標準例外は文字列オブジェクトになります。これは、クラスベースの例外が異なる語義を持つことが理由でうまく動作しないコードを動作させる必要があるときに必要となります。 -Xオプションはパイソンの将来のバージョンでは無くなる予定なので、コードを修正することが解決策としてはお勧めです。

同じ値を持つ2つの別個の文字列オブジェクトは異なる例外と考えられます。 これは、プログラマが例外ハンドラを指定する際、文字列の値よりも例外名を使うことを強制するためです。 組み込み例外の文字列の値はその名前ですが、これはユーザ定義例外またはライブラリモジュールで定義された例外には要求されていません。

特定のクラスを挙げたexcept節を持つtry文において、クラス例外に関してはその節はそのクラスから導出されたすべての例外クラスも処理します。(しかしそのクラスを導出した例外クラスについては違います。) サブクラス化により関連付けられていない2つの例外クラスは、それらが同じ名前を持っていたとしても決して等しくはありません。   

以下にリストされている組み込み例外はインタプリタあるいは組み込み関数によって生成されます。例外は特に言及されている場合を除いて、詳細なエラー原因を示す「関連する値」を持っています。 これは文字列またはいくつかの情報項目を含むタプル(例えばエラーコードとコードの意味を説明する文字列)であるかも知れません。 関連する値はraise文に対する2番目の引数です。
文字列例外に関しては、関連する値それ自身が(もしあれば)except節の2番目の引数に指定された変数に格納されることになります。
ルートクラスであるExceptionから導出されたクラス例外に関しては、その変数は例外のインスタンスを受け取ります、そして関連する値は例外のインスタンスのargs属性として渡されます。この値はraiseに対する2番目の引数がそうでない場合でもタプルです。(そしてそれはシングルトンタプルです。)  

ユーザのコードで組み込み例外を発生させることが可能です。これを使えば、例外ハンドラをテストしたり、あるいはインタプリタが同じ例外を発生させるのと「ちょうど同じような」状態のエラー条件を報告させたりすることができます。しかしユーザのコードで不適当なエラーを発生させないようにする方法は無いことに注意して下さい。

以下の例外は他の例外に対するベースクラスとして使われるだけです。 文字列ベースの標準例外が使われる場合、それらは直接導出されたクラスを含むタプルです。

Exception
例外のルートクラスです。すべての組み込み例外はこのクラスから導出されます。 すべてのユーザ定義例外もまたこのクラスから導出されるべきですが、これは(まだ)強制的なものではありません。 str()関数は、このクラス(または大抵の導出されたクラス)のインスタンスに適用されると引数の文字列値を返すか、コンストラクタに引数が与えられていなかったときには空文字列を返します。シーケンスとして使用された場合には、これはコンストラクタに与えられた引数を呼び出します(これは古いコードに対する互換性のために便利)。

StandardError
組み込み例外に対するベースクラスです。すべての組み込み例外はこのクラス(それ自身はルートクラスExceptionから導出されている)から導出されます。

ArithmeticError
様々な算術エラー OverflowError,ZeroDivisionError, FloatingPointError で発生する組み込み例外に対するベースクラスです。

LookupError
マッピングまたはシーケンスのインデックスが正しくないとき発生する例外: IndexError,KeyError例外クラスのベースクラスです。

以下の例外が実際に発生する例外です。 これらは、文字列ベースの標準例外に戻すために-Xオプションを使用した場合を除いてクラスオブジェクトです。

AssertionError
assert文が失敗したとき発生します。  

AttributeError
属性参照または代入が失敗すると発生します。(オブジェクトが属性参照または代入をサポートしていない場合はTypeErrorが発生します。)

EOFError
組み込み関数(input()またはraw_input())が全くデータを読まないでファイルの終端(EOF)を検出したときに発生します。 (注:ファイルオブジェクトのread()readline()メソッドはEOFを検出したとき空文字列を返します。)関連する値はありません。

FloatingPointError
浮動小数点演算が失敗すると発生します。この例外は常に定義されていますが、パイソンが-with-fpectlオプション付で構成されているか、WANT_SIGFPE_HANDLERシンボルが"config.h"ファイルで定義されているときのみ発生します。

IOError
print文やopen()組み込み関数やファイルオブジェクトのメソッドのようなI/O操作がI/O関連の理由で(例えば「ファイルが見つからない」や「ディスクが一杯」)失敗すると発生します。

クラス例外が使用される場合、この例外はIOError(errno, strerror)としてインスタンス化されます。インスタンスはそれぞれエラーコードとエラーメッセージがセットされるerrnostrerrorという付加的な2つの属性を持ちます。 これらの属性のデフォルトはNoneです。

ImportError
import文がモジュール定義を見付けられないか、from ... importでインポートする名前を見付けられないときに発生します。

IndexError
シーケンスの添字が範囲外のときに発生します。(スライスの添字は範囲に収まるように自動的に切り詰められます。添字が整数でなければTypeErrorが発生します。)

KeyError
マッピング(辞書)のキーが現在あるキーセット内に見つからないときに発生します。

KeyboardInterrupt
ユーザが割り込みキー(通常はControl-CまたはDEL)を押したときに発生します。実行中、割り込みのチェックは定期的に行われます。組み込み関数 input()またはraw_input()を使った入力待ち状態で割り込みキーが押された場合にもこの例外が発生します。関連する値はありません。

MemoryError
ある操作でメモリ不足になったが(オブジェクトを削除することで)まだ回復できるかもしれない状況のとき発生します。関連する値は、メモリ不足を引き起こした(内部)操作の種類を示す文字列です。 基礎としているメモリ管理アーキテクチャ(Cのmalloc()関数)のため、インタプリタはこの状況からいつも完全に回復できるわけではないことに注意して下さい。 それでもインタプリタはスタックトレースを表示させるために例外を発生させます。

NameError
ローカルまたはグローバル名が見つからないとき発生します。これは修飾されていない名前にたいしてのみ適用されます。関連する値は見付けられなかった名前です。

OverflowError
算術演算の結果が大きすぎて表現できないときに発生します。 これはロング整数に対しては発生することはありません(この場合は表現することを諦めずMemoryErrorが発生することになるでしょう)。 Cにおいては浮動小数点例外を処理する標準が無いので、ほとんどの浮動小数点演算はチェックされません。単純な整数に対しては、左シフト(大抵のアプリケーションは例外を発生させるよりビットを落とす方を選びます)を除いてオーバフローを起こし得るすべての演算をチェックします。

RuntimeError
他のどのカテゴリにも属さないエラーが検出されると発生します。 関連する値は何が悪いかを正確に示す文字列です。(この例外は以前のバージョンのインタプリタからの遺物で、これ以上多くは使われません。)

SyntaxError
パーサが文法エラーを検出すると発生します。これはimport文、exec文、組み込み関数eval()input()、または初期スクリプトを読み込んでいるときや標準入力(対話モードでも同じ)を読み込んでいるときに発生します。

クラス例外が使われるとき、このクラスのインスタンスは属性 filename, lineno, offset, textを持っていて、簡単に詳細を取り出せるようになっています。 文字列例外に対しては、関連する値は通常(message, (filename, lineno, offset, text))形式のタプルです。 クラス例外に対しては、str()はメッセージのみを返します。

SystemError
インタプリタが内部エラーを検出すると発生しますが、状況はすべての望みを捨てるほど深刻なものではありません。関連する値は何が悪いかを示す文字列(低レベル用語で書かれた)です。 この例外はパイソンインタプリタの著者または維持者に報告すべきです。 パイソンインタプリタのバージョン文字列(sys.version:パイソンインタプリタを対話的に起動したとき最初に表示されます。)、正確なエラーメッセージ(例外に関連する値)、もし出来ればエラーの引金になったプログラムのソースを必ず報告して下さい。

SystemExit
この例外はsys.exit()関数によって発生します。これが処理されなければパイソンインタプリタは終了します。スタックトレースは表示されません。関連する値が単純な整数なら、それはシステム終了ステータス(Cのexit()関数に渡された)です。Noneであれば終了ステータスは0です。他のタイプ(文字列のような)を持てばオブジェクトの値が表示され終了ステータスは1です。

クラス例外が使われるときは、そのインスタンスは属性code(デフォルトはNoneで、終了ステータスかエラーメッセージがセットされています)を持っています。 sys.exit()の呼び出しは例外に翻訳されるので、クリーンアップハンドラ(try文のfinally節)を実行させることができ、また制御を失う危険なしにデバッガはスクリプトを実行することが出来ます。 無条件に速やかに終了したいときにはos._exit()関数を使うことが出来ます(例えば、子プロセス内でfork()した後)。

TypeError
組み込み演算または関数が不適当なタイプのオブジェクトに適用されたときに発生します。関連する値はタイプミスマッチに関する詳細情報を示す文字列です。

ValueError
組み込み演算または関数が、タイプは正しいが不適当な値を持つ引数を受け取り、その状況がIndexErrorのようなより緻密な例外で記述されないときに発生します。

ZeroDivisionError
割算またはモジュロ演算の第2引数が0のとき発生します。関連する値はオペランドのタイプと演算を示す文字列です。

guido@python.org