例外処理
********

この章で説明する関数を使うと、 Python の例外の処理や送出ができるように
なります。 Python の例外処理の基本をいくらか理解することが大切です。例
外は POSIX "errno" 変数にやや似た機能を果たします: 発生した中で最も新
しいエラーの (スレッド毎の) グローバルなインジケータがあります。実行に
成功した場合にはほとんどの C API 関数がこれをクリアしませんが、失敗し
たときにはエラーの原因を示すために設定します。ほとんどの C API 関数は
エラーインジケータも返し、通常は関数がポインタを返すことになっている場
合は *NULL* であり、関数が整数を返す場合は "-1" です。(例外:
"PyArg_*()" 関数は実行に成功したときに "1" を返し、失敗したときに "0"
を返します).

ある関数が呼び出した関数がいくつか失敗したために、その関数が失敗しなけ
ればならないとき、一般的にエラーインジケータを設定しません。呼び出した
関数がすでに設定しています。エラーを処理して例外をクリアするか、あるい
は (オブジェクト参照またはメモリ割り当てのような)それが持つどんなリソ
ースも取り除いた後に戻るかのどちらか一方を行う責任があります。エラーを
処理する準備をしていなければ、普通に続けるべきでは *ありません*。エラ
ーのために戻る場合は、エラーが設定されていると呼び出し元に知らせること
が大切です。エラーが処理されていない場合または丁寧に伝えられている場合
には、Python/C APIのさらなる呼び出しは意図した通りには動かない可能性が
あり、不可解な形で失敗するかもしれません。

エラーインジケータは Python 変数 "sys.exc_type", "sys.exc_value" およ
び "sys.exc_traceback" に対応する三つの Python オブジェクトからからな
ります。いろいろな方法でエラーインジケータとやりとりするために API 関
数が存在します。各スレッドに別々のエラーインジケータがあります。

void PyErr_PrintEx(int set_sys_last_vars)

   Print a standard traceback to "sys.stderr" and clear the error
   indicator. **Unless** the error is a "SystemExit".  In that case
   the no traceback is printed and Python process will exit with the
   error code specified by the "SystemExit" instance.

   Call this function **only** when the error indicator is set.
   Otherwise it will cause a fatal error!

   *set_sys_last_vars* が非ゼロであれば、 "sys.last_type",
   "sys.last_value", "sys.last_traceback" 変数が、表示される例外のタイ
   プ、値、トレースバックそれぞれに反映されます。

void PyErr_Print()

   "PyErr_PrintEx(1)" のエイリアス.

PyObject* PyErr_Occurred()
    *Return value: Borrowed reference.*

   エラーインジケータが設定されているかテストします。設定されている場
   合は、例外の *型* ("PyErr_Set*()" 関数の一つあるいは
   "PyErr_Restore()" への最も新しい呼び出しに対する第一引数)を返します
   。設定されていない場合は *NULL* を返します。あなたは戻り値への参照
   を持っていませんので、それに "Py_DECREF()" する必要はありません。

   注釈: 戻り値を特定の例外と比較しないでください。その代わりに、下
     に示す "PyErr_ExceptionMatches()" を使ってください。(比較は簡単に
     失敗す るでしょう。なぜなら、例外はクラスではなくインスタンスかも
     しれな いし、あるいは、クラス例外の場合は期待される例外のサブクラ
     スかも しれないからです。)

int PyErr_ExceptionMatches(PyObject *exc)

   "PyErr_GivenExceptionMatches(PyErr_Occurred(), exc)" と同じ。例外が
   実際に設定されたときにだけ、これを呼び出だすべきです。例外が発生し
   ていないならば、メモリアクセス違反が起きるでしょう。

int PyErr_GivenExceptionMatches(PyObject *given, PyObject *exc)

   *given* 例外が *exc* の例外と一致するなら真を返します。これは *exc*
   がクラスオブジェクトである場合も真を返します。これは *given* がサブ
   クラスのインスタンスであるときも真を返します。*exc* がタプルならば
   、タプル内(と再帰的にサブタプル内)のすべての例外が一致するか調べら
   れます。

void PyErr_NormalizeException(PyObject**exc, PyObject**val, PyObject**tb)

   ある状況では、以下の "PyErr_Fetch()" が返す値は "正規化されていない
   " 可能性があります。つまり、 "*exc" はクラスオブジェクトだが "*val"
   は同じクラスのインスタンスではないという意味です。この関数はそのよ
   うな場合にそのクラスをインスタンス化するために使われます。その値が
   すでに正規化されている場合は何も起きません。遅延正規化はパフォーマ
   ンスを改善するために実装されています。

void PyErr_Clear()

   エラーインジケータをクリアします。エラーインジケータが設定されてい
   ないならば、効果はありません。

void PyErr_Fetch(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)

   エラーインジケータをアドレスを渡す三つの変数の中へ取り出します。エ
   ラーインジケータが設定されていない場合は、三つすべての変数を *NULL*
   に設定します。エラーインジケータが設定されている場合はクリアされ、
   あなたは取り出されたそれぞれのオブジェクトへの参照を持つことになり
   ます。型オブジェクトが *NULL* でないときでさえ、その値とトレースバ
   ックオブジェクトは *NULL* かもしれません。

   注釈: 通常、この関数は例外を扱う必要のあるコードあるいはエラーイ
     ンジケ ータを一時的に保存して元に戻す必要のあるコードによってのみ
     使用さ れます。

void PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)

   三つのオブジェクトからエラーインジケータを設定します。エラーインジ
   ケータがすでに設定されている場合は、最初にクリアされます。オブジェ
   クトが *NULL* ならば、エラーインジケータがクリアされます。*NULL* の
   typeと非 *NULL* のvalueあるいは tracebackを渡してはいけません。例外
   の型(type)はクラスであるべきです。無効な例外の型(type)あるいは値
   (value)を渡してはいけません。(これらの規則を破ると後で気付きにくい
   問題の原因となるでしょう。) この呼び出しはそれぞれのオブジェクトへ
   の参照を取り除きます: あなたは呼び出しの前にそれぞれのオブジェクト
   への参照を持たなければならないのであり、また呼び出しの後にはもはや
   これらの参照を持っていません。(これを理解していない場合は、この関数
   を使ってはいけません。注意しておきます。)

   注釈: 通常この関数はエラーインジケータを一時的に保存し元に戻す必
     要のあ るコードによってのみに使われます。現在の例外状態を保存する
     ために は "PyErr_Fetch()" を使ってください。

void PyErr_SetString(PyObject *type, const char *message)

   これはエラーインジケータを設定するための最も一般的な方法です。第一
   引数は例外の型を指定します。通常は標準例外の一つ、例えば
   "PyExc_RuntimeError" です。その参照カウントを増加させる必要はありま
   せん。第二引数はエラーメッセージで、文字列オブジェクトへ変換されま
   す。

void PyErr_SetObject(PyObject *type, PyObject *value)

   この関数は "PyErr_SetString()" に似ていますが、例外の"値(value)"と
   して任意のPythonオブジェクトを指定することができます。

PyObject* PyErr_Format(PyObject *exception, const char *format, ...)
    *Return value: Always NULL.*

   この関数はエラーインジケータを設定し *NULL* を返します。
   *exception* はPython 例外クラスであるべきです。 *format* と以降の引
   数はエラーメッセージを作るためのもので, "PyString_FromFormat()" の
   引数と同じ意味を持っています。

void PyErr_SetNone(PyObject *type)

   これは "PyErr_SetObject(type, Py_None)" を省略したものです。

int PyErr_BadArgument()

   これは "PyErr_SetString(PyExc_TypeError, message)" を省略したもので
   、ここで *message* は組み込み操作が不正な引数で呼び出されたというこ
   とを表しています。主に内部で使用するためのものです。

PyObject* PyErr_NoMemory()
    *Return value: Always NULL.*

   これは "PyErr_SetNone(PyExc_MemoryError)" を省略したもので、*NULL*
   を返します。したがって、メモリ不足になったとき、オブジェクト割り当
   て関数は "return PyErr_NoMemory();" と書くことができます。

PyObject* PyErr_SetFromErrno(PyObject *type)
    *Return value: Always NULL.*

   Cライブラリ関数がエラーを返してC変数 "errno" を設定したときに、これ
   は例外を発生させるために便利な関数です。第一要素が整数 "errno" 値で
   、第二要素が ("strerror()" から得られる)対応するエラーメッセージで
   あるタプルオブジェクトを構成します。それから、
   "PyErr_SetObject(type, object)" を呼び出します。 Unixでは、 "errno"
   値が "EINTR" であるとき、すなわち割り込まれたシステムコールを表して
   いるとき、これは "PyErr_CheckSignals()" を呼び出し、それがエラーイ
   ンジケータを設定した場合は設定されたままにしておきます。関数は常に
   *NULL* を返します。したがって、システムコールがエラーを返したとき、
   システムコールのラッパー関数は "return PyErr_SetFromErrno(type);"
   と書くことができます。

PyObject* PyErr_SetFromErrnoWithFilenameObject(PyObject *type, PyObject *filenameObject)

   "PyErr_SetFromErrno()" に似ていますが、 *filenameObject* が *NULL*
   でない場合にそれを *type* のコンストラクタに第三引数として渡す、と
   いうふるまいが追加されています。 "IOError" と "OSError" のような例
   外の場合では、これが例外インスタンスの "filename" 属性を定義するた
   めに使われます。

PyObject* PyErr_SetFromErrnoWithFilename(PyObject *type, const char *filename)
    *Return value: Always NULL.*

   "PyErr_SetFromErrnoWithFilenameObject()" と似ていますが、ファイル名
   は C 文字列として与えられます。

PyObject* PyErr_SetFromWindowsErr(int ierr)
    *Return value: Always NULL.*

   これは "WindowsError" を発生させるために便利な関数です。 "0" の
   *ierr* とともに呼び出された場合、 "GetLastError()" が返すエラーコー
   ドが代りに使われます。 *ierr* あるいは "GetLastError()" によって与
   えられるエラーコードのWindows用の説明を取り出すために、Win32関数
   "FormatMessage()" を呼び出します。それから、第一要素が *ierr* 値で
   第二要素が("FormatMessage()" から得られる) 対応するエラーメッセージ
   であるタプルオブジェクトを構成します。そして、
   "PyErr_SetObject(PyExc_WindowsError, object)" を呼び出します。この
   関数は常に *NULL* を返します。利用可能範囲: Windows。

PyObject* PyErr_SetExcFromWindowsErr(PyObject *type, int ierr)
    *Return value: Always NULL.*

   "PyErr_SetFromWindowsErr()" に似ていますが、送出する例外の型を指定
   する引数が追加されています。利用可能範囲: Windows。

   バージョン 2.3 で追加.

PyObject* PyErr_SetFromWindowsErrWithFilenameObject(int ierr, PyObject *filenameObject)

   "PyErr_SetFromWindowsErr()" に似ていますが、 *filenameObject* が
   *NULL* でない場合には "WindowsError" のコンストラクタに第三引数とし
   て渡されるというふるまいが追加されています。利用可能範囲: Windows。

PyObject* PyErr_SetFromWindowsErrWithFilename(int ierr, const char *filename)
    *Return value: Always NULL.*

   "PyErr_SetFromWindowsErrWithFilenameObject()" と似ていますが、ファ
   イル名は C 文字列として与えられます。利用可能範囲: Windows。

PyObject* PyErr_SetExcFromWindowsErrWithFilenameObject(PyObject *type, int ierr, PyObject *filename)

   "PyErr_SetFromWindowsErrWithFilenameObject()" に似ていますが、送出
   する例外の型を指定する引数が追加されています。利用可能範囲: Windows
   。

   バージョン 2.3 で追加.

PyObject* PyErr_SetExcFromWindowsErrWithFilename(PyObject *type, int ierr, const char *filename)
    *Return value: Always NULL.*

   "PyErr_SetFromWindowsErrWithFilename()" に似ていますが、送出する例
   外の型を指定する引数が追加されています。利用可能範囲: Windows。

   バージョン 2.3 で追加.

void PyErr_BadInternalCall()

   "PyErr_SetString(PyExc_SystemError, message)" を省略したものです。
   ここで *message* は内部操作(例えば、Python/C API関数)が不正な引数と
   ともに呼び出されたということを示しています。主に内部で使用するため
   のものです。

int PyErr_WarnEx(PyObject *category, char *message, int stacklevel)

   警告メッセージを発行します。 *category* 引数は警告カテゴリ(以下を参
   照) かまたは *NULL* で、 *message* 引数はメッセージ文字列です。
   *stacklevel* はスタックフレームの数を示す正の整数です; 警告はそのス
   タックフレームの中の実行している行から発行されます。 *stacklevel*
   が 1 だと "PyErr_WarnEx()" を呼び出している関数が、2 だとその上の関
   数が Warning の発行元になります。

   この関数は通常警告メッセージを *sys.stderr* へプリントします。けれ
   ども、ユーザが警告をエラーへ変更するように指定することも可能です。
   そのような場合には、これは例外を発生させます。警告機構がもつ問題の
   ためにその関数が例外を発生させるということも可能です。(実装ではその
   厄介な仕事を行うために "warnings" モジュールをインポートします)。例
   外が発生させられなければ、戻り値は "0" です。あるいは、例外が発生さ
   せられると "-1" です。(警告メッセージが実際にプリントされるかどうか
   を決定することはできず、また何がその例外の原因なのかを決定すること
   もできない。これは意図的なものです。)例外が発生した場合、呼び出し元
   は通常の例外処理を行います(例えば、 "Py_DECREF()" は参照を持ってお
   り、エラー値を返します)。

   Warning categories must be subclasses of "PyExc_Warning";
   "PyExc_Warning" is a subclass of "PyExc_Exception"; the default
   warning category is "PyExc_RuntimeWarning". The standard Python
   warning categories are available as global variables whose names
   are enumerated at Standard Warning Categories.

   警告をコントロールするための情報については、 "warnings" モジュール
   のドキュメンテーションとコマンドライン・ドキュメンテーションの "-W"
   オプションを参照してください。警告コントロールのためのC APIはありま
   せん。

int PyErr_Warn(PyObject *category, char *message)

   警告メッセージを発行します。 *category* 引数は警告カテゴリ(以下を参
   照) かまたは *NULL* で、 *message* 引数はメッセージ文字列です。警告
   は、 "PyErr_WarnEx()" を *stacklevel* に 1 を指定した時と同じく、
   "PyErr_Warn()" を呼び出した関数から発行されます。

   非推奨; "PyErr_WarnEx()" を使って下さい。

int PyErr_WarnExplicit(PyObject *category, const char *message, const char *filename, int lineno, const char *module, PyObject *registry)

   すべての警告の属性を明示的に制御した警告メッセージを出します。これ
   は Python 関数 "warnings.warn_explicit()" の直接的なラッパで、さら
   に情報を得るにはそちらを参照してください。そこに説明されているデフ
   ォルトの効果を得るために、 *module* と *registry* 引数は *NULL* に
   設定することができます。

int PyErr_WarnPy3k(char *message, int stacklevel)

   "Py_Py3kWarningFlag" フラグが有効な場合、与えられた *message* と
   *stacklevel* に応じて "DeprecationWarning" を発生します。

   バージョン 2.6 で追加.

int PyErr_CheckSignals()

   この関数はPythonのシグナル処理とやりとりすることができます。シグナ
   ルがそのプロセスへ送られたかどうかチェックし、そうならば対応するシ
   グナルハンドラを呼び出します。 "signal" モジュールがサポートされて
   いる場合は、これはPythonで書かれたシグナルハンドラを呼び出せます。
   すべての場合で、 "SIGINT" のデフォルトの効果は "KeyboardInterrupt"
   例外を発生させることです。例外が発生した場合、エラーインジケータが
   設定され、関数は "-1" を返します。そうでなければ、関数は "0" を返し
   ます。エラーインジケータが以前に設定されている場合は、それがクリア
   されるかどうかわからない。

void PyErr_SetInterrupt()

   この関数は廃止されています。 "SIGINT" シグナルが到達した影響をシミ
   ュレートします --- 次に "PyErr_CheckSignals()" が呼ばれるとき、
   "KeyboardInterrupt" は送出されるでしょう。インタプリタロックを保持
   することなく呼び出すことができます。

int PySignal_SetWakeupFd(int fd)

   このユーティリティ関数は、シグナルを受信したときに "'\0'" バイトを
   書き込むファイルディスクリプタを指定します。戻り値は、それまで設定
   されていたファイルディスクリプタです。 "-1" はこの機能を無効にしま
   す。これは初期状態です。これは Python の "signal.set_wakeup_fd()"
   と同じものですが、エラーチェックを行ないません。 *fd* は有効なファ
   イルディスクリプタであるべきです。この関数の呼び出しはメインスレッ
   ドのみから行われるべきです。

   バージョン 2.6 で追加.

PyObject* PyErr_NewException(char *name, PyObject *base, PyObject *dict)
    *Return value: New reference.*

   このユーティリティ関数は新しい例外クラスを作成して返します。 *name*
   引数は新しい例外の名前、 "module.classname" 形式の C文字列でなけれ
   ばならない。 *base* と *dict* 引数は通常 *NULL* です。これはすべて
   の例外のためのルート、組み込み名 "Exception" (Cでは
   "PyExc_Exception" としてアクセス可能)をルートとして派生したクラスオ
   ブジェクトを作成します。

   新しいクラスの "__module__" 属性は *name* 引数の前半部分(最後のドッ
   トまで)に設定され、クラス名は後半部分(最後のドットの後)に設定されま
   す。 *base* 引数は代わりのベースクラスを指定するために使えます; 一
   つのクラスでも、クラスのタプルでも構いません。 *dict* 引数はクラス
   変数とメソッドの辞書を指定するために使えます。

PyObject* PyErr_NewExceptionWithDoc(char *name, char *doc, PyObject *base, PyObject *dict)
    *Return value: New reference.*

   "PyErr_NewException()" とほぼ同じですが、新しい例外クラスに簡単に
   docstring を設定できます。 *doc* が *NULL* で無い場合、それが例外ク
   ラスの docstring になります。

   バージョン 2.7 で追加.

void PyErr_WriteUnraisable(PyObject *obj)

   例外が設定されているがインタプリタが実際に例外を発生させることがで
   きないときに、このユーティリティ関数は警告メッセージを "sys.stderr"
   へプリントします。例えば、例外が "__del__()" メソッドで発生したとき
   に使われます。

   発生させられない例外が起きたコンテキストを指し示す単一の引数 *obj*
   で関数が呼び出されます。 可能な場合は、 *obj* の repr 文字列が警告
   メッセージに出力されます。


Unicode 例外オブジェクト
========================

以下の関数は C言語から Unicode 例外を作ったり修正したりするために利用
します。

PyObject* PyUnicodeDecodeError_Create(const char *encoding, const char *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)

   *encoding*, *object*, *length*, *start*, *end*, *reason* 属性をもっ
   た "UnicodeDecodeError" オブジェクトを作成します。

PyObject* PyUnicodeEncodeError_Create(const char *encoding, const Py_UNICODE *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)

   *encoding*, *object*, *length*, *start*, *end*, *reason* 属性を持っ
   た "UnicodeEncodeError" オブジェクトを作成します。

PyObject* PyUnicodeTranslateError_Create(const Py_UNICODE *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)

   *object*, *length*, *start*, *end*, *reason* 属性を持った
   "UnicodeTranslateError" オブジェクトを作成します。

PyObject* PyUnicodeDecodeError_GetEncoding(PyObject *exc)
PyObject* PyUnicodeEncodeError_GetEncoding(PyObject *exc)

   与えられた例外オブジェクトの *encoding* 属性を返します。

PyObject* PyUnicodeDecodeError_GetObject(PyObject *exc)
PyObject* PyUnicodeEncodeError_GetObject(PyObject *exc)
PyObject* PyUnicodeTranslateError_GetObject(PyObject *exc)

   与えられた例外オブジェクトの *object* 属性を返します。

int PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
int PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
int PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)

   渡された例外オブジェクトから *start* 属性を取得して **start* に格納
   します。*start* は *NULL* であってはなりません。成功したら "0" を、
   失敗したら "-1" を返します。

int PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
int PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
int PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)

   渡された例外オブジェクトの *start* 属性を *start* に設定します。成
   功したら "0" を、失敗したら "-1" を返します。

int PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
int PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
int PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *end)

   渡された例外オブジェクトから *end* 属性を取得して **end* に格納しま
   す。*end* は *NULL* であってはなりません。成功したら "0" を、失敗し
   たら "-1" を返します。

int PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
int PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
int PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)

   渡された例外オブジェクトの *end* 属性を *end* に設定します。成功し
   たら "0" を、失敗したら "-1" を返します。

PyObject* PyUnicodeDecodeError_GetReason(PyObject *exc)
PyObject* PyUnicodeEncodeError_GetReason(PyObject *exc)
PyObject* PyUnicodeTranslateError_GetReason(PyObject *exc)

   渡された例外オブジェクトの *reason* 属性を返します。

int PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
int PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
int PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)

   渡された例外オブジェクトの *reason* 属性を *reason* に設定します。
   成功したら "0" を、失敗したら "-1" を返します。


再帰の管理
==========

これら2つの関数は C レベルの再帰呼び出しを安全に実行する方法を、コアモ
ジュールにも拡張モジュールにも提供します。再帰を使ったコードが必ずしも
Python コードを実行するわけではない場合 (Python コードは再帰の深さを自
動的に追跡します)、これらの関数が必要となります。

int Py_EnterRecursiveCall(const char *where)

   C レベルの再帰呼び出しをしようとしているところに印を付けます。

   "USE_STACKCHECK" が定義されている場合、 OS のスタックがオーバーフロ
   ーがしたかどうかを "PyOS_CheckStack()" を使ってチェックします。もし
   オーバーフローしているなら、 "MemoryError" をセットしゼロでない値を
   返します。

   次にこの関数は再帰の上限に達していないかをチェックします。上限に達
   している場合、 "RuntimeError" をセットしゼロでない値を返します。そ
   うでない場合はゼロを返します。

   再帰の深さの上限に達して送出される "RuntimeError" のメッセージに連
   結できるよう *where* は "" in instance check"" のような文字列にして
   ください。

void Py_LeaveRecursiveCall()

   "Py_EnterRecursiveCall()" を終了させます。
   "Py_EnterRecursiveCall()" の *成功した* 呼び出しに対し 1 回呼ばなけ
   ればなりません。


標準例外
========

"PyExc_" の後ろにPythonの例外名が続く名前をもつグローバル変数として、
すべての標準Python例外が利用可能です。これらは型 "PyObject*" を持ち、
すべてクラスオブジェクトです。完璧を期するために、すべての変数を以下に
列挙します:

+-------------------------------------------+-----------------------------------+------------+
| C名                                       | Python名                          | 注釈       |
+===========================================+===================================+============+
| "PyExc_BaseException"                     | "BaseException"                   | (1), (4)   |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_Exception"                         | "Exception"                       | (1)        |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_StandardError"                     | "StandardError"                   | (1)        |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_ArithmeticError"                   | "ArithmeticError"                 | (1)        |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_AssertionError"                    | "AssertionError"                  |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_AttributeError"                    | "AttributeError"                  |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_BufferError"                       | "BufferError"                     |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_EnvironmentError"                  | "EnvironmentError"                | (1)        |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_EOFError"                          | "EOFError"                        |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_FloatingPointError"                | "FloatingPointError"              |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_GeneratorExit"                     | "GeneratorExit"                   |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_ImportError"                       | "ImportError"                     |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_IndentationError"                  | "IndentationError"                |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_IndexError"                        | "IndexError"                      |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_IOError"                           | "IOError"                         |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_KeyError"                          | "KeyError"                        |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_KeyboardInterrupt"                 | "KeyboardInterrupt"               |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_LookupError"                       | "LookupError"                     | (1)        |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_MemoryError"                       | "MemoryError"                     |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_NameError"                         | "NameError"                       |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_NotImplementedError"               | "NotImplementedError"             |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_OSError"                           | "OSError"                         |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_OverflowError"                     | "OverflowError"                   |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_ReferenceError"                    | "ReferenceError"                  | (2)        |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_RuntimeError"                      | "RuntimeError"                    |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_StopIteration"                     | "StopIteration"                   |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_SyntaxError"                       | "SyntaxError"                     |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_SystemError"                       | "SystemError"                     |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_SystemExit"                        | "SystemExit"                      |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_TabError"                          | "TabError"                        |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_TypeError"                         | "TypeError"                       |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_UnboundLocalError"                 | "UnboundLocalError"               |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_UnicodeDecodeError"                | "UnicodeDecodeError"              |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_UnicodeEncodeError"                | "UnicodeEncodeError"              |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_UnicodeError"                      | "UnicodeError"                    |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_UnicodeTranslateError"             | "UnicodeTranslateError"           |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_VMSError"                          | "VMSError"                        | (5)        |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_ValueError"                        | "ValueError"                      |            |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_WindowsError"                      | "WindowsError"                    | (3)        |
+-------------------------------------------+-----------------------------------+------------+
| "PyExc_ZeroDivisionError"                 | "ZeroDivisionError"               |            |
+-------------------------------------------+-----------------------------------+------------+

注釈:

1. これは別の標準例外のためのベースクラスです。

2. これは "weakref.ReferenceError" と同じです。

3. Windowsでのみ定義されています。プリプロセッサマクロ "MS_WINDOWS"
   が 定義されているかテストすることで、これを使うコードを保護してくだ
   さ い。

4. バージョン 2.5 で追加.

5. Only defined on VMS; protect code that uses this by testing that
   the preprocessor macro "__VMS" is defined.


Standard Warning Categories
===========================

All standard Python warning categories are available as global
variables whose names are "PyExc_" followed by the Python exception
name. These have the type "PyObject*"; they are all class objects. For
completeness, here are all the variables:

+--------------------------------------------+-----------------------------------+------------+
| C名                                        | Python名                          | 注釈       |
+============================================+===================================+============+
| "PyExc_Warning"                            | "Warning"                         | (1)        |
+--------------------------------------------+-----------------------------------+------------+
| "PyExc_BytesWarning"                       | "BytesWarning"                    |            |
+--------------------------------------------+-----------------------------------+------------+
| "PyExc_DeprecationWarning"                 | "DeprecationWarning"              |            |
+--------------------------------------------+-----------------------------------+------------+
| "PyExc_FutureWarning"                      | "FutureWarning"                   |            |
+--------------------------------------------+-----------------------------------+------------+
| "PyExc_ImportWarning"                      | "ImportWarning"                   |            |
+--------------------------------------------+-----------------------------------+------------+
| "PyExc_PendingDeprecationWarning"          | "PendingDeprecationWarning"       |            |
+--------------------------------------------+-----------------------------------+------------+
| "PyExc_RuntimeWarning"                     | "RuntimeWarning"                  |            |
+--------------------------------------------+-----------------------------------+------------+
| "PyExc_SyntaxWarning"                      | "SyntaxWarning"                   |            |
+--------------------------------------------+-----------------------------------+------------+
| "PyExc_UnicodeWarning"                     | "UnicodeWarning"                  |            |
+--------------------------------------------+-----------------------------------+------------+
| "PyExc_UserWarning"                        | "UserWarning"                     |            |
+--------------------------------------------+-----------------------------------+------------+

注釈:

1. This is a base class for other standard warning categories.


文字列の例外
============

バージョン 2.6 で変更: 発生したりキャッチされる全ての例外は
"BaseException" を継承しなければなりません。文字列例外を発生させようと
すると "TypeError" が発生されます。
