# 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` 節) が実行されるようにするため、またデバッガが制御不能になるリスクを冒さずにスクリプトを実行できるようにするために例外に翻訳されます。即座に終了することが真に強く必要であるとき (例えば、 `os.fork()` を呼んだ後の子プロセス内) には `os._exit()` 関数を使うことができます。

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

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

exception `TypeError`

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

exception `UnboundLocalError`

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

  バージョン 2.0 で追加.

exception `UnicodeError`

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

  `UnicodeError` はエンコードまたはデコードのエラーの説明を属性として持っています。例えば、 `err.object[err.start:err.end]` は、無効な入力のうちコーデックが処理に失敗した箇所を表します。

  `encoding`

    エラーを送出したエンコーディングの名前です。

  `reason`

    そのコーデックエラーを説明する文字列です。

  `object`

    コーデックがエンコードまたはデコードしようとしたオブジェクトです。

  `start`

    `object` の最初の無効なデータのインデクスです。

  `end`

    `object` の最後の無効なデータの次のインデクスです。

  バージョン 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`

  除算やモジュロ演算の第二引数が 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 で追加.

exception `BytesWarning`

  Base class for warnings related to bytes and bytearray.

  バージョン 2.6 で追加.

## 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