6. 組み込み例外

例外はクラスオブジェクトです。例外はモジュール exceptions で定義されています。このモジュールを明示的にインポートする必要はありません。例外は exceptions モジュールと同様に組み込み名前空間で与えられます。

try 文の中で、 except 節を使って特定の例外クラスについて記述した場合、その節は指定した例外クラスから派生したクラスも扱います (指定した例外クラスの派生元のクラスは含みません)。サブクラス化の関係にない 2 つの例外クラスは、それらが同じ名前だったとしても等しくなることはありません。

以下に列挙した組み込み例外はインタプリタや組み込み関数によって生成されます。特に注記しないかぎり、これらの例外はエラーの詳しい原因を示している、 “関連値 (associated value)” を持ちます。この値は文字列または複数の情報 (例えばエラーコードや、エラーコードを説明する文字列) を含むタプルです。この関連値は raise 文の 2 番目の引数です。例外が標準のルートクラスである BaseException の派生クラスであれば、関連値は例外インスタンスの args 属性中に置かれます。

ユーザによるコードも組み込み例外を送出することができます。これは例外処理をテストしたり、インタプリタがある例外を送出する状況と “ちょうど同じような” エラー条件であることを報告させるために使うことができます。しかし、ユーザが適切でないエラーを送出するようコードすることを妨げる方法はないので注意してください。

組み込み例外クラスは新たな例外を定義するためにサブクラス化することができます。新しい例外は、少なくとも Exception クラスから派生することをお勧めします。 BaseException からは派生しないで下さい。例外を定義する上での詳しい情報は、 Python チュートリアルの ユーザー定義例外 の項目にあります。

以下の例外クラスは他の例外クラスの基底クラスとしてのみ使われます。

exception BaseException

全ての組み込み例外のルートクラスです。ユーザ定義例外が直接このクラスを継承することは意図していません (そうした場合は Exception を使ってください)。このクラスに対して str()unicode() が呼ばれた場合、引数の文字列表現か、引数が無い時には空文字列が返されます。

バージョン 2.5 で追加.

args

例外コンストラクタに与えられた引数のタプルです。組み込み例外は普通、エラーメッセージを与える一つの文字列だけを引数として呼ばれますが、中には (IOError など) いくつかの引数を必要とし、このタプルの要素に特別な意味を込めるものもあります。

exception Exception

全ての組み込み例外のうち、システム終了でないものはこのクラスから導出されています。全てのユーザ定義例外はこのクラスの派生クラスであるべきです。

バージョン 2.5 で変更: BaseException を継承するように変更されました.

exception StandardError

StopIteration, SystemExit, KeyboardInterrupt, SystemExit 以外の、全ての組み込み例外の基底クラスです。 StandardError 自体は Exception の派生クラスです。

exception ArithmeticError

算術上の様々なエラーにおいて送出される組み込み例外 OverflowError, ZeroDivisionError, FloatingPointError の基底クラスです。

exception BufferError

バッファ (buffer) に関連する演算が行えなかったときに送出されます。

exception LookupError

マップ型またはシーケンス型に使われたキーやインデックスが無効な場合に送出される例外 IndexError および KeyError の基底クラスです。 codecs.lookup() によって直接送出されることもあります。

exception EnvironmentError

Python システムの外部で起こる可能性のある例外 IOError および OSError の基底クラスです。この型の例外が 2 つの要素を持つタプルで生成された場合、 1 番目の要素はインスタンスの errno 属性で得ることができます (この値はエラー番号と見なされます)。 2 番目の要素は strerror 属性です (この値は通常、エラーに関連するメッセージです)。タプル自体は args 属性から得ることもできます。

バージョン 1.5.2 で追加.

EnvironmentError 例外が 3 要素のタプルで生成された場合、最初の 2 つの要素は上記と同様に値を得ることができ、さらに 3 番目の要素は filename 属性で得ることができます。しかしながら、以前のバージョンとの互換性のために、 args 属性にはコンストラクタに渡した最初の 2 つの引数からなる 2 要素のタプルしか含みません。

この例外が 3 つ以外の引数で生成された場合、 filename 属性は None になります。この例外が 2 つまたは 3 つ以外の引数で生成された場合、 errno および strerror 属性も None になります。後者のケースでは、 args がコンストラクタに与えた引数をそのままタプルの形で含んでいます。

以下の例外は実際に送出される例外です。

exception AssertionError

assert 文が失敗した場合に送出されます。

exception AttributeError

属性の参照 (属性参照 を参照) や代入が失敗した場合に送出されます (オブジェクトが属性の参照や属性の代入をまったくサポートしていない場合には TypeError が送出されます)。

exception EOFError

組み込み関数 (input() または raw_input()) のいずれかで、データを全く読まないうちにファイルの終端 (EOF) に到達した場合に送出されます (注意: file.read() および file.readline() メソッドの場合、データを読まないうちに EOF にたどり着くと空の文字列を返します)。

exception FloatingPointError

浮動小数点演算が失敗した場合に送出されます。この例外は Python のどのバージョンでも常に定義されていますが、 Python が --with-fpectl オプションを有効にしてコンパイルされているか、 pyconfig.h ファイルにシンボル WANT_SIGFPE_HANDLER が定義されている場合にのみ送出されます。

exception GeneratorExit

ジェネレータ (generator) の close() メソッドが呼び出されたときに送出されます。この例外は厳密にはエラーではないので、 StandardError ではなく BaseException を直接継承しています。

バージョン 2.5 で追加.

バージョン 2.6 で変更: BaseException を継承するように変更されました。

exception IOError

(print 文、組み込みの open() またはファイルオブジェクトに対するメソッドといった) I/O 操作が、例えば “ファイルが存在しません” や “ディスクの空き領域がありません” といった I/O に関連した理由で失敗した場合に送出されます。

このクラスは EnvironmentError の派生クラスです。この例外クラスのインスタンス属性に関する情報は上記の EnvironmentError に関する議論を参照してください。

バージョン 2.6 で変更: socket.error は、この例外を基底クラスとして使うように変更されました。

exception ImportError

import 文でモジュール定義を見つけられなかった場合や、 from ... import 文で指定した名前をインポートすることができなかった場合に送出されます。

exception IndexError

シーケンスのインデックス指定がシーケンスの範囲を超えている場合に送出されます (スライスのインデックスはシーケンスの範囲に収まるように暗黙のうちに調整されます; インデックスが通常の整数でない場合、 TypeError が送出されます)。

exception KeyError

マップ型 (辞書型) オブジェクトのキーが、オブジェクトのキー集合内に見つからなかった場合に送出されます。

exception KeyboardInterrupt

ユーザが割り込みキー (通常は Control-C または Delete キー) を押した場合に送出されます。割り込みが起きたかどうかはインタプリタの実行中に定期的に調べられます。組み込み関数 input()raw_input() がユーザの入力を待っている間に割り込みキーを押してもこの例外が送出されます。この例外は Exception を処理するコードに誤って捕捉されてインタプリタの終了が阻害されないように BaseException を継承しています。

バージョン 2.5 で変更: BaseException を継承するように変更されました.

exception MemoryError

ある操作中にメモリが不足したが、その状況は (オブジェクトをいくつか消去することで) まだ復旧可能かもしれない場合に送出されます。例外の関連値は、どんな種類の (内部) 操作がメモリ不足になっているかを示す文字列です。背後にあるメモリ管理アーキテクチャ (C の malloc() 関数) によっては、インタプリタが常にその状況を完璧に復旧できるとはかぎらないので注意してください; プログラムの暴走が原因の場合にも、やはり実行スタックの追跡結果を出力できるようにするために例外が送出されます。

exception NameError

ローカルまたはグローバルの名前が見つからなかった場合に送出されます。これは非限定の名前のみに適用されます。関連値は見つからなかった名前を含むエラーメッセージです。

exception NotImplementedError

この例外は RuntimeError から派生しています。ユーザ定義の基底クラスにおいて、抽象メソッドが派生クラスでオーバライドされることを要求する場合、この例外を送出しなくてはなりません。

バージョン 1.5.2 で追加.

exception OSError

このクラスは EnvironmentError から派生しています。関数がシステムに関連したエラーを返した場合に送出されます (引数の型が間違っている場合や、他の偶発的なエラーは除きます)。 errno 属性は errno に基づく数字のエラーコードで、 strerror 属性は C の perror() 関数で表示されるような文字列です。オペレーティングシステムに依存したエラーコードの定義と名前については、 errno モジュールを参照して下さい。

ファイルシステムのパスに関係する例外 (chdir()unlink() など) では、例外インスタンスは 3 番目の属性 filename を持ちます。これは関数に渡されたファイル名です。

バージョン 1.5.2 で追加.

exception OverflowError

算術演算の結果が表現できない大きな値になった場合に送出されます。これは long integer の演算と通常の整数に関するほとんどの操作では起こりません (long integer の演算ではむしろ MemoryError が送出されることになるでしょう)。整数に関するほとんどの操作では、代わりに long integer が返されます。 C の浮動小数点演算の例外処理は標準化されていないので、ほとんどの浮動小数点演算もチェックされません。

exception ReferenceError

weakref.proxy() によって生成された弱参照 (weak reference) プロキシを使って、ガーベジコレクションによって回収された後の参照対象オブジェクトの属性にアクセスした場合に送出されます。弱参照については weakref モジュールを参照してください。

バージョン 2.2 で追加: 以前は weakref.ReferenceError 例外として知られていました。

exception RuntimeError

他のカテゴリに分類できないエラーが検出された場合に送出されます。関連値は、何が問題だったのかをより詳細に示す文字列です (この例外はほとんど過去のバージョンのインタプリタにおける遺物です。今ではあまり使われることはありません)。

exception StopIteration

イテレータ (iterator) の next() メソッドにより、それ以上要素がないことを知らせるために送出されます。この例外は、通常の利用方法ではエラーとはみなされないため、 StandardError ではなく Exception から派生しています。

バージョン 2.2 で追加.

exception SyntaxError

パーザが構文エラーに遭遇した場合に送出されます。この例外は import 文、 exec 文、組み込み関数 evel()input() 、初期化スクリプトの読み込みや標準入力で (対話的な実行時にも) 起こる可能性があります。

このクラスのインスタンスは、例外の詳細に簡単にアクセスできるようにするために、属性 filename, lineno, offset, text を持ちます。例外インスタンスに対する str() はメッセージのみを返します。

exception IndentationError

正しくないインデントに関する構文エラーの基底クラスです。これは SyntaxError のサブクラスです。

exception TabError

タブとスペースを一貫しない方法でインデントに使っているときに送出されます。これは IndentationError のサブクラスです。

exception SystemError

インタプリタが内部エラーを発見したが、その状況は全ての望みを棄てさせるほど深刻ではないように思われる場合に送出されます。関連値は (下位層の言葉で) 何がまずいのかを示す文字列です。

Python の作者か、あなたの Python インタプリタを保守している人にこのエラーを報告してください。このとき、 Python インタプリタのバージョン (sys.version; Python の対話的セッションを開始した際にも出力されます)、正確なエラーメッセージ (例外の関連値) を忘れずに報告してください。そしてもし可能ならエラーを引き起こしたプログラムのソースコードを報告してください。

exception SystemExit

この例外は sys.exit() 関数によって送出されます。この例外が処理されなかった場合、スタックのトレースバックを全く表示することなく Python インタプリタは終了します。関連値が通常の整数であれば、システム終了ステータスを表します (exit() 関数に渡されます)。値が None の場合、終了ステータスは 0 です。 (文字列のような) 他の型の場合、そのオブジェクトの値が表示され、終了ステータスは 1 になります。

この例外のインスタンスは属性 code を持ちます。この値は終了ステータスまたはエラーメッセージ (標準では None) に設定されます。また、この例外は厳密にはエラーではないため、 StandardError ではなく BaseException から派生しています。

sys.exit() は、クリーンアップのための処理 (try 文の finally 節) が実行されるようにするため、またデバッガが制御不能になるリスクを冒さずにスクリプトを実行できるようにするために例外に翻訳されます。即座に終了することが真に強く必要であるとき (例えば、 fork() を呼んだ後の子プロセス内) には os._exit() 関数を使うことができます。

この例外は Exception を捕まえるコードに間違って捕まえられないように、 StandardErrorException からではなく BaseException を継承しています。これにより、この例外は着実に呼出し元の方に伝わっていってインタプリタを終了させます。

バージョン 2.5 で変更: BaseException を継承するように変更されました。

exception TypeError

組み込み演算または関数が適切でない型のオブジェクトに対して適用された際に送出されます。関連値は型の不整合に関して詳細を述べた文字列です。

exception UnboundLocalError

関数やメソッド内のローカルな変数に対して参照を行ったが、その変数には値が代入されていなかった場合に送出されます。 NameError のサブクラスです。

バージョン 2.0 で追加.

exception UnicodeError

Unicode に関するエンコードまたはデコードのエラーが発生した際に送出されます。 ValueError のサブクラスです。

バージョン 2.0 で追加.

exception UnicodeEncodeError

Unicode 関連のエラーがエンコード中に発生した際に送出されます。 UnicodeError のサブクラスです。

バージョン 2.3 で追加.

exception UnicodeDecodeError

Unicode 関連のエラーがデコード中に発生した際に送出されます。 UnicodeError のサブクラスです。

バージョン 2.3 で追加.

exception UnicodeTranslateError

Unicode 関連のエラーがコード翻訳に発生した際に送出されます。 UnicodeError のサブクラスです。

バージョン 2.3 で追加.

exception ValueError

組み込み演算や関数が、正しい型だが適切でない値を受け取った場合や、 IndexError のような詳細な説明のできない状況で送出されます。

exception VMSError

VMS においてのみ利用可能です。 VMS 特有のエラーが起こったときに送出されます。

exception WindowsError

Windows 特有のエラーか、エラー番号が errno 値に対応しない場合に送出されます。 winerrno および strerror の値は Windows プラットフォーム API の関数 GetLastError()FormatMessage() の戻り値から生成されます。 errno の値は winerror の値を対応する errno.h の値にマップしたものです。 OSError のサブクラスです。

バージョン 2.0 で追加.

バージョン 2.5 で変更: 以前のバージョンは GetLastError() のコードを errno に入れていました。

exception ZeroDivisionError

除算またモジュロ演算における 2 番目の引数が 0 であった場合に送出されます。関連値は文字列で、その演算における被演算子と演算子の型を示します。

以下の例外は警告カテゴリとして使われます。詳細については warnings モジュールを参照してください。

exception Warning

警告カテゴリの基底クラスです。

exception UserWarning

ユーザコードによって生成される警告の基底クラスです。

exception DeprecationWarning

廃止された機能に対する警告の基底クラスです。

exception PendingDeprecationWarning

将来廃止される予定の機能に対する警告の基底クラスです。

exception SyntaxWarning

曖昧な構文に対する警告の基底クラスです。

exception RuntimeWarning

あいまいなランタイム挙動に対する警告の基底クラスです。

exception FutureWarning

将来意味構成が変わることになっている文の構成に対する警告の基底クラスです。

exception ImportWarning

モジュールインポートの誤りと思われるものに対する警告の基底クラスです。

バージョン 2.5 で追加.

exception UnicodeWarning

Unicode に関連した警告の基底クラスです。

バージョン 2.5 で追加.

6.1. 例外のクラス階層

組み込み例外のクラス階層は以下のようになっています:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StandardError
      |    +-- BufferError
      |    +-- ArithmeticError
      |    |    +-- FloatingPointError
      |    |    +-- OverflowError
      |    |    +-- ZeroDivisionError
      |    +-- AssertionError
      |    +-- AttributeError
      |    +-- EnvironmentError
      |    |    +-- IOError
      |    |    +-- OSError
      |    |         +-- WindowsError (Windows)
      |    |         +-- VMSError (VMS)
      |    +-- EOFError
      |    +-- ImportError
      |    +-- LookupError
      |    |    +-- IndexError
      |    |    +-- KeyError
      |    +-- MemoryError
      |    +-- NameError
      |    |    +-- UnboundLocalError
      |    +-- ReferenceError
      |    +-- RuntimeError
      |    |    +-- NotImplementedError
      |    +-- SyntaxError
      |    |    +-- IndentationError
      |    |         +-- TabError
      |    +-- SystemError
      |    +-- TypeError
      |    +-- ValueError
      |         +-- UnicodeError
      |              +-- UnicodeDecodeError
      |              +-- UnicodeEncodeError
      |              +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
	   +-- ImportWarning
	   +-- UnicodeWarning
	   +-- BytesWarning