例外処理—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.9/c-api/exceptions
移動先:案内検索

例外処理

この章で説明する関数を使用すると、Python例外を処理して発生させることができます。 Pythonの例外処理の基本を理解することが重要です。 これは、POSIX errno変数のように機能します。最後に発生したエラーのグローバルインジケーター(スレッドごと)があります。 ほとんどのCAPI関数は、成功時にこれをクリアしませんが、失敗時にエラーの原因を示すように設定します。 ほとんどのCAPI関数は、エラーインジケータも返します。通常、ポインタを返すことになっている場合はNULL、整数を返す場合は-1です(例外: PyArg _ * 関数は、成功した場合は1を返し、失敗した場合は0を返します。

具体的には、エラーインジケータは、例外のタイプ、例外の値、およびトレースバックオブジェクトの3つのオブジェクトポインタで構成されます。 設定されていない場合、これらのポインタはいずれもNULLになります(ただし、一部の組み合わせは禁止されています。たとえば、例外タイプがNULLの場合、NULL以外のトレースバックを使用することはできません。 ])。

呼び出された関数の一部が失敗したために関数が失敗しなければならない場合、通常、エラーインジケーターは設定されません。 それが呼び出した関数はすでにそれを設定しました。 エラーを処理して例外をクリアするか、保持しているリソース(オブジェクト参照やメモリ割り当てなど)をクリーンアップした後に戻る責任があります。 エラーを処理する準備ができていない場合は、通常どおりしない必要があります。 エラーが原因で戻ってきた場合は、エラーが設定されたことを発信者に示すことが重要です。 エラーが処理されないか、注意深く伝播されない場合、Python / C APIへの追加の呼び出しが意図したとおりに動作せず、不思議な方法で失敗する可能性があります。

ノート

エラーインジケータは、 sys.exc_info()の結果ではなくです。 前者はまだキャッチされていない(したがってまだ伝播している)例外に対応し、後者はキャッチされた(したがって伝播を停止した)後に例外を返します。


印刷とクリア

void PyErr_Clear()
エラーインジケータをクリアします。 エラーインジケータが設定されていない場合、効果はありません。
void PyErr_PrintEx(int set_sys_last_vars)

sys.stderrへの標準トレースバックを印刷し、エラーインジケータをクリアします。 エラーがSystemExitでない限り、その場合、トレースバックは出力されず、PythonプロセスはSystemExitインスタンスで指定されたエラーコードで終了します。

エラーインジケータが設定されている場合は、この関数をのみで呼び出します。 そうしないと、致命的なエラーが発生します。

set_sys_last_vars がゼロ以外の場合、変数 sys.last_typesys.last_value 、および sys.last_traceback は、タイプ、値に設定されます。印刷された例外のトレースバック。

void PyErr_Print()
PyErr_PrintEx(1)のエイリアス。
void PyErr_WriteUnraisable(PyObject *obj)

現在の例外と obj 引数を使用して、 sys.unraisablehook()を呼び出します。

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

この関数は、発生不可能な例外が発生したコンテキストを識別する単一の引数 obj で呼び出されます。 可能であれば、 obj のreprが警告メッセージに出力されます。

この関数を呼び出すときは、例外を設定する必要があります。


例外の発生

これらの関数は、現在のスレッドのエラーインジケータを設定するのに役立ちます。 便宜上、これらの関数の一部は、returnステートメントで使用するために常にNULLポインターを返します。

void PyErr_SetString(PyObject *type, const char *message)
これは、エラーインジケータを設定する最も一般的な方法です。 最初の引数は例外タイプを指定します。 これは通常、標準的な例外の1つです。 PyExc_RuntimeError。 参照カウントをインクリメントする必要はありません。 2番目の引数はエラーメッセージです。 'utf-8'からデコードされます。
void PyErr_SetObject(PyObject *type, PyObject *value)
この関数は PyErr_SetString()に似ていますが、例外の「値」に任意のPythonオブジェクトを指定できます。
PyObject *PyErr_Format(PyObject *exception, const char *format, ...)
この関数はエラーインジケータを設定し、NULLを返します。 exception はPython例外クラスである必要があります。 format 以降のパラメーターは、エラーメッセージのフォーマットに役立ちます。 これらは、 PyUnicode_FromFormat()と同じ意味と値を持っています。 format は、ASCIIでエンコードされた文字列です。
PyObject *PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)

PyErr_Format()と同じですが、可変数の引数ではなくva_list引数を取ります。

バージョン3.5の新機能。

void PyErr_SetNone(PyObject *type)
これはPyErr_SetObject(type, Py_None)の省略形です。
int PyErr_BadArgument()
これはPyErr_SetString(PyExc_TypeError, message)の省略形です。ここで、 message は、組み込み操作が不正な引数で呼び出されたことを示します。 これは主に内部使用のためのものです。
PyObject *PyErr_NoMemory()
これはPyErr_SetNone(PyExc_MemoryError)の省略形です。 NULLを返すため、オブジェクト割り当て関数は、メモリが不足したときにreturn PyErr_NoMemory();を書き込むことができます。
PyObject *PyErr_SetFromErrno(PyObject *type)
これは、Cライブラリ関数がエラーを返し、C変数errnoを設定したときに例外を発生させる便利な関数です。 最初の項目が整数errno値で、2番目の項目が対応するエラーメッセージ(strerror()から取得)であるタプルオブジェクトを作成し、PyErr_SetObject(type, object)を呼び出します。 Unixでは、errnoの値がEINTRで、システムコールが中断されたことを示している場合、 PyErr_CheckSignals()が呼び出され、エラーインジケーターが設定されている場合は、それ。 この関数は常にNULLを返すため、システムコールのラッパー関数は、システムコールがエラーを返したときにreturn PyErr_SetFromErrno(type);を書き込むことができます。
PyObject *PyErr_SetFromErrnoWithFilenameObject(PyObject *type, PyObject *filenameObject)
PyErr_SetFromErrno()と同様ですが、 filenameObjectNULLでない場合、 type のコンストラクターに3番目のパラメーター。 OSError 例外の場合、これは例外インスタンスのfilename属性を定義するために使用されます。
PyObject *PyErr_SetFromErrnoWithFilenameObjects(PyObject *type, PyObject *filenameObject, PyObject *filenameObject2)

PyErr_SetFromErrnoWithFilenameObject()に似ていますが、2つのファイル名を取得する関数が失敗したときにエラーを発生させるために、2番目のファイル名オブジェクトを取得します。

バージョン3.4の新機能。

PyObject *PyErr_SetFromErrnoWithFilename(PyObject *type, const char *filename)
PyErr_SetFromErrnoWithFilenameObject()に似ていますが、ファイル名はC文字列として指定されます。 filename は、ファイルシステムエンコーディング( os.fsdecode())からデコードされます。
PyObject *PyErr_SetFromWindowsErr(int ierr)
これは、 WindowsError を発生させるための便利な関数です。 0 ierr で呼び出された場合、代わりにGetLastError()の呼び出しによって返されたエラーコードが使用されます。 Win32関数FormatMessage()を呼び出して、 ierr またはGetLastError()で指定されたエラーコードのWindows記述を取得し、最初の項目がであるタプルオブジェクトを作成します。 ierr 値で、2番目の項目が対応するエラーメッセージ(FormatMessage()から取得)である場合、PyErr_SetObject(PyExc_WindowsError, object)を呼び出します。 この関数は常にNULLを返します。
PyObject *PyErr_SetExcFromWindowsErr(PyObject *type, int ierr)
PyErr_SetFromWindowsErr()と同様ですが、発生する例外タイプを指定する追加のパラメーターがあります。
PyObject *PyErr_SetFromWindowsErrWithFilename(int ierr, const char *filename)
PyErr_SetFromWindowsErrWithFilenameObject()に似ていますが、ファイル名はC文字列として指定されます。 filename は、ファイルシステムエンコーディング( os.fsdecode())からデコードされます。
PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(PyObject *type, int ierr, PyObject *filename)
PyErr_SetFromWindowsErrWithFilenameObject()と同様ですが、発生する例外タイプを指定する追加のパラメーターがあります。
PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(PyObject *type, int ierr, PyObject *filename, PyObject *filename2)

PyErr_SetExcFromWindowsErrWithFilenameObject()に似ていますが、2番目のファイル名オブジェクトを受け入れます。

バージョン3.4の新機能。

PyObject *PyErr_SetExcFromWindowsErrWithFilename(PyObject *type, int ierr, const char *filename)
PyErr_SetFromWindowsErrWithFilename()に似ていますが、発生する例外タイプを指定する追加のパラメーターがあります。
PyObject *PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)

これは、 ImportError を発生させるための便利な関数です。 msg が例外のメッセージ文字列として設定されます。 namepath は、どちらもNULLになり、 ImportError のそれぞれのnamepath属性。

バージョン3.3の新機能。

void PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)

現在の例外のファイル、行、およびオフセット情報を設定します。 現在の例外が SyntaxError でない場合は、追加の属性を設定します。これにより、例外印刷サブシステムは、例外が SyntaxError であると見なします。

バージョン3.4の新機能。

void PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)

PyErr_SyntaxLocationObject()と同様ですが、 filename は、ファイルシステムエンコーディング( os.fsdecode())からデコードされたバイト文字列です。

バージョン3.2の新機能。

void PyErr_SyntaxLocation(const char *filename, int lineno)
PyErr_SyntaxLocationEx()と同様ですが、col_offsetパラメーターが省略されています。
void PyErr_BadInternalCall()
これはPyErr_SetString(PyExc_SystemError, message)の省略形であり、メッセージは内部操作(例: Python / C API関数)が不正な引数で呼び出されました。 これは主に内部使用のためのものです。


警告の発行

これらの関数を使用して、Cコードから警告を発行します。 これらは、Python 警告モジュールによってエクスポートされた同様の関数を反映しています。 通常、警告メッセージを sys.stderr に出力します。 ただし、警告をエラーに変換するようにユーザーが指定した可能性もあり、その場合は例外が発生します。 警告機構の問題により、機能が例外を発生させる可能性もあります。 戻り値は、例外が発生しなかった場合は0、例外が発生した場合は-1です。 (警告メッセージが実際に出力されるかどうか、または例外の理由を判別することはできません。これは意図的なものです。)例外が発生した場合、呼び出し元は通常の例外処理を実行する必要があります(たとえば、 Py_DECREF()が所有する参照であり、エラー値を返します)。

int PyErr_WarnEx(PyObject *category, const char *message, Py_ssize_t stack_level)

警告メッセージを発行します。 category 引数は、警告カテゴリ(以下を参照)またはNULLです。 message 引数はUTF-8でエンコードされた文字列です。 stack_level は正の数で、スタックフレームの数を示します。 警告は、そのスタックフレームで現在実行中のコード行から発行されます。 1の stack_level は、 PyErr_WarnEx()を呼び出す関数、2はその上の関数などです。

警告カテゴリは、PyExc_Warningのサブクラスである必要があります。 PyExc_WarningPyExc_Exceptionのサブクラスです。 デフォルトの警告カテゴリはPyExc_RuntimeWarningです。 標準のPython警告カテゴリは、標準の警告カテゴリに名前が列挙されているグローバル変数として利用できます。

警告制御の詳細については、 warnings モジュールのドキュメントおよびコマンドラインドキュメントの -W オプションを参照してください。 警告制御用のCAPIはありません。

PyObject *PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, PyObject *name, PyObject *path)

PyErr_SetImportError()とよく似ていますが、この関数を使用すると、 ImportError のサブクラスを指定して発生させることができます。

バージョン3.6の新機能。

int PyErr_WarnExplicitObject(PyObject *category, PyObject *message, PyObject *filename, int lineno, PyObject *module, PyObject *registry)

すべての警告属性を明示的に制御して警告メッセージを発行します。 これは、Python関数 warnings.warn_explicit()の単純なラッパーです。詳細については、こちらを参照してください。 module および registry 引数をNULLに設定して、そこに記載されているデフォルトの効果を得ることができます。

バージョン3.4の新機能。

int PyErr_WarnExplicit(PyObject *category, const char *message, const char *filename, int lineno, const char *module, PyObject *registry)
PyErr_WarnExplicitObject()と似ていますが、メッセージモジュールはUTF-8でエンコードされた文字列であり、ファイル名はファイルシステムエンコードからデコードされます( os.fsdecode())。
int PyErr_WarnFormat(PyObject *category, Py_ssize_t stack_level, const char *format, ...)

PyErr_WarnEx()と同様の機能ですが、 PyUnicode_FromFormat()を使用して警告メッセージをフォーマットします。 format は、ASCIIでエンコードされた文字列です。

バージョン3.2の新機能。

int PyErr_ResourceWarning(PyObject *source, Py_ssize_t stack_level, const char *format, ...)

PyErr_WarnFormat()と同様の関数ですが、カテゴリResourceWarning であり、 sourcewarnings.WarningMessage()に渡します。

バージョン3.6の新機能。


エラーインジケータのクエリ

PyObject *PyErr_Occurred()

エラーインジケータが設定されているかどうかをテストします。 設定されている場合は、例外 type PyErr_Set * 関数の1つまたは PyErr_Restore()への最後の呼び出しに対する最初の引数)を返します。 設定されていない場合は、NULLを返します。 戻り値への参照を所有していないため、 Py_DECREF()する必要はありません。

発信者はGILを保持する必要があります。

ノート

戻り値を特定の例外と比較しないでください。 以下に示すように、代わりに PyErr_ExceptionMatches()を使用してください。 (クラス例外の場合、例外はクラスではなくインスタンスである可能性があるため、または予期される例外のサブクラスである可能性があるため、比較は簡単に失敗する可能性があります。)

int PyErr_ExceptionMatches(PyObject *exc)
PyErr_GivenExceptionMatches(PyErr_Occurred(), exc)と同等です。 これは、例外が実際に設定されている場合にのみ呼び出す必要があります。 例外が発生していない場合、メモリアクセス違反が発生します。
int PyErr_GivenExceptionMatches(PyObject *given, PyObject *exc)
give 例外が exc の例外タイプと一致する場合はtrueを返します。 exc がクラスオブジェクトの場合、 give がサブクラスのインスタンスである場合もtrueを返します。 exc がタプルの場合、タプル内の(およびサブタプル内の再帰的な)すべての例外タイプで一致するものが検索されます。
void PyErr_Fetch(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)

エラーインジケータを、アドレスが渡される3つの変数に取得します。 エラーインジケータが設定されていない場合は、3つの変数すべてをNULLに設定します。 設定されている場合はクリアされ、取得した各オブジェクトへの参照を所有します。 タイプオブジェクトがNULLである可能性があります。

ノート

この関数は通常、例外をキャッチする必要があるコード、またはエラーインジケータを一時的に保存および復元する必要があるコードによってのみ使用されます。例:

{
   PyObject *type, *value, *traceback;
   PyErr_Fetch(&type, &value, &traceback);

   /* ... code that might produce other errors ... */

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

3つのオブジェクトからエラーインジケータを設定します。 エラーインジケータがすでに設定されている場合は、最初にクリアされます。 オブジェクトがNULLの場合、エラーインジケータはクリアされます。 NULLタイプおよびNULL以外の値またはトレースバックを渡さないでください。 例外タイプはクラスである必要があります。 無効な例外タイプまたは値を渡さないでください。 (これらのルールに違反すると、後で微妙な問題が発生します。)この呼び出しでは、各オブジェクトへの参照が削除されます。呼び出しの前と呼び出し後に、これらの参照を所有しなくなった場合は、各オブジェクトへの参照を所有する必要があります。 (これがわからない場合は、この機能を使用しないでください。 警告しました。)

ノート

この関数は通常、エラーインジケータを一時的に保存および復元する必要があるコードでのみ使用されます。 PyErr_Fetch()を使用して、現在のエラーインジケーターを保存します。

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

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

ノート

この関数は、例外値に__traceback__属性を暗黙的に設定しません。 トレースバックを適切に設定する必要がある場合は、次の追加のスニペットが必要です。

if (tb != NULL) {
  PyException_SetTraceback(val, tb);
}
void PyErr_GetExcInfo(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)

sys.exc_info()からわかるように、例外情報を取得します。 これは、新たに発生した例外ではなく、すでにキャッチされた例外を指します。 NULLのいずれかである3つのオブジェクトの新しい参照を返します。 例外情報の状態を変更しません。

ノート

この関数は通常、例外を処理したいコードでは使用されません。 むしろ、コードが例外状態を一時的に保存および復元する必要がある場合に使用できます。 PyErr_SetExcInfo()を使用して、例外状態を復元またはクリアします。

バージョン3.3の新機能。

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

sys.exc_info()からわかるように、例外情報を設定します。 これは、新たに発生した例外ではなく、すでにキャッチされた例外を指します。 この関数は、引数の参照を盗みます。 例外状態をクリアするには、3つの引数すべてにNULLを渡します。 3つの引数に関する一般的な規則については、 PyErr_Restore()を参照してください。

ノート

この関数は通常、例外を処理したいコードでは使用されません。 むしろ、コードが例外状態を一時的に保存および復元する必要がある場合に使用できます。 PyErr_GetExcInfo()を使用して、例外状態を読み取ります。

バージョン3.3の新機能。


信号処理

int PyErr_CheckSignals()
この関数は、Pythonの信号処理と相互作用します。 シグナルがプロセスに送信されたかどうかをチェックし、送信された場合は、対応するシグナルハンドラーを呼び出します。 signal モジュールがサポートされている場合、Pythonで記述されたシグナルハンドラーを呼び出すことができます。 すべての場合において、SIGINTのデフォルトの効果は、 KeyboardInterrupt 例外を発生させることです。 例外が発生すると、エラーインジケータが設定され、関数は-1を返します。 それ以外の場合、関数は0を返します。 エラーインジケータは、以前に設定されている場合はクリアされる場合とされない場合があります。
void PyErr_SetInterrupt()

到着するSIGINT信号の効果をシミュレートします。 次回 PyErr_CheckSignals()が呼び出されると、SIGINTのPythonシグナルハンドラーが呼び出されます。

SIGINTがPythonによって処理されない場合( signal.SIG_DFL または signal.SIG_IGN に設定されている場合)、この関数は何もしません。

int PySignal_SetWakeupFd(int fd)

このユーティリティ関数は、信号を受信するたびに信号番号が1バイトとして書き込まれるファイル記述子を指定します。 fd は非ブロッキングである必要があります。 以前のそのようなファイル記述子を返します。

-1は機能を無効にします。 これが初期状態です。 これは、Pythonの signal.set_wakeup_fd()と同等ですが、エラーチェックはありません。 fd は有効なファイル記述子である必要があります。 関数はメインスレッドからのみ呼び出す必要があります。

バージョン3.5で変更: Windowsでは、この関数はソケットハンドルもサポートするようになりました。


例外クラス

PyObject *PyErr_NewException(const char *name, PyObject *base, PyObject *dict)

このユーティリティ関数は、新しい例外クラスを作成して返します。 name 引数は、新しい例外の名前、module.classnameの形式のC文字列である必要があります。 base および dict 引数は、通常NULLです。 これにより、 Exception (CではPyExc_Exceptionとしてアクセス可能)から派生したクラスオブジェクトが作成されます。

新しいクラスの__module__属性は、 name 引数の最初の部分(最後のドットまで)に設定され、クラス名は最後の部分(最後の後)に設定されますドット)。 base 引数を使用して、代替の基本クラスを指定できます。 1つのクラスのみ、またはクラスのタプルにすることができます。 dict 引数を使用して、クラス変数とメソッドのディクショナリを指定できます。

PyObject *PyErr_NewExceptionWithDoc(const char *name, const char *doc, PyObject *base, PyObject *dict)

PyErr_NewException()と同じですが、新しい例外クラスにdocstringを簡単に指定できる点が異なります。 docNULL以外の場合は、docstringとして使用されます。例外クラスの場合。

バージョン3.2の新機能。


例外オブジェクト

PyObject *PyException_GetTraceback(PyObject *ex)
__traceback__を介してPythonからアクセスできるように、例外に関連付けられたトレースバックを新しい参照として返します。 トレースバックが関連付けられていない場合、NULLが返されます。
int PyException_SetTraceback(PyObject *ex, PyObject *tb)
例外に関連付けられたトレースバックを tb に設定します。 Py_Noneを使用してクリアします。
PyObject *PyException_GetContext(PyObject *ex)
Pythonから__context__を介してアクセスできるように、例外に関連付けられたコンテキスト( ex の処理中に発生した別の例外インスタンス)を新しい参照として返します。 関連付けられたコンテキストがない場合、これはNULLを返します。
void PyException_SetContext(PyObject *ex, PyObject *ctx)
例外に関連付けられているコンテキストを ctx に設定します。 NULLを使用してクリアします。 ctx が例外インスタンスであることを確認するための型チェックはありません。 これにより、 ctx への参照が盗まれます。
PyObject *PyException_GetCause(PyObject *ex)
__cause__を介してPythonからアクセスできるように、例外に関連付けられた原因(例外インスタンス、またはraise ... from ...によって設定された None )を新しい参照として返します。
void PyException_SetCause(PyObject *ex, PyObject *cause)

例外に関連する原因を cause に設定します。 NULLを使用してクリアします。 cause が例外インスタンスまたは None のいずれかであることを確認するためのタイプチェックはありません。 これは原因への参照を盗みます。

__suppress_context__は、この関数によって暗黙的にTrueに設定されます。


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)
属性 encodingobjectlengthstart 、 end [を使用して UnicodeDecodeError オブジェクトを作成します。 X140X]および理由encoding および reason は、UTF-8でエンコードされた文字列です。
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)

属性 encodingobjectlengthstart 、 end [を使用して UnicodeEncodeError オブジェクトを作成します。 X140X]および理由encoding および reason は、UTF-8でエンコードされた文字列です。

バージョン3.3以降非推奨: 3.11

Py_UNICODEは、Python3.3以降非推奨になりました。 PyObject_CallFunction(PyExc_UnicodeEncodeError, "sOnns", ...)に移行してください。

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

属性 objectlengthstartend 、 reason [を使用して UnicodeTranslateError オブジェクトを作成します。 X144X]。 reason は、UTF-8でエンコードされた文字列です。

バージョン3.3以降非推奨: 3.11

Py_UNICODEは、Python3.3以降非推奨になりました。 PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns", ...)に移行してください。

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 に配置します。 startNULLであってはなりません。 成功した場合は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 に配置します。 endNULLであってはなりません。 成功した場合は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コード(再帰の深さを自動的に追跡する)を呼び出すとは限らない場合に必要です。 呼び出しプロトコルが再帰処理を処理するため、 tp_call の実装にも必要ありません。

int Py_EnterRecursiveCall(const char *where)

再帰的な経営幹部レベルの呼び出しが実行されようとしているポイントをマークします。

USE_STACKCHECKが定義されている場合、この関数は PyOS_CheckStack()を使用してOSスタックがオーバーフローしたかどうかをチェックします。 この場合、 MemoryError を設定し、ゼロ以外の値を返します。

次に、関数は再帰制限に達しているかどうかを確認します。 この場合、 RecursionError が設定され、ゼロ以外の値が返されます。 それ以外の場合は、ゼロが返されます。

ここで、は、" in instance check"などのUTF-8でエンコードされた文字列であり、再帰の深さ制限によって発生する RecursionError メッセージに連結されます。

バージョン3.9で変更:この関数は、制限付きAPIでも使用できるようになりました。

void Py_LeaveRecursiveCall(void)

Py_EnterRecursiveCall()を終了します。 Py_EnterRecursiveCall()成功呼び出しごとに1回呼び出す必要があります。

バージョン3.9で変更:この関数は、制限付きAPIでも使用できるようになりました。

コンテナタイプに tp_repr を適切に実装するには、特別な再帰処理が必要です。 tp_repr は、スタックを保護するだけでなく、サイクルを防ぐためにオブジェクトを追跡する必要もあります。 次の2つの機能は、この機能を容易にします。 事実上、これらは reprlib.recursive_repr()と同等のCです。

int Py_ReprEnter(PyObject *object)

tp_repr 実装の開始時に呼び出され、サイクルを検出します。

オブジェクトがすでに処理されている場合、関数は正の整数を返します。 その場合、 tp_repr 実装は、サイクルを示す文字列オブジェクトを返す必要があります。 例として、 dict オブジェクトは{...}を返し、 list オブジェクトは[...]を返します。

再帰制限に達すると、関数は負の整数を返します。 その場合、 tp_repr 実装は通常、NULLを返す必要があります。

それ以外の場合、関数はゼロを返し、 tp_repr の実装は正常に続行できます。

void Py_ReprLeave(PyObject *object)
Py_ReprEnter()を終了します。 ゼロを返す Py_ReprEnter()の呼び出しごとに1回呼び出す必要があります。


標準例外

すべての標準Python例外は、名前がPyExc_の後にPython例外名が続くグローバル変数として使用できます。 これらのタイプは PyObject * です。 それらはすべてクラスオブジェクトです。 完全を期すために、ここにすべての変数があります:

C名 Python名 ノート
PyExc_BaseException BaseException (1)
PyExc_Exception Exception (1)
PyExc_ArithmeticError ArithmeticError (1)
PyExc_AssertionError AssertionError
PyExc_AttributeError AttributeError
PyExc_BlockingIOError BlockingIOError
PyExc_BrokenPipeError BrokenPipeError
PyExc_BufferError BufferError
PyExc_ChildProcessError ChildProcessError
PyExc_ConnectionAbortedError ConnectionAbortedError
PyExc_ConnectionError ConnectionError
PyExc_ConnectionRefusedError ConnectionRefusedError
PyExc_ConnectionResetError ConnectionResetError
PyExc_EOFError EOFError
PyExc_FileExistsError FileExistsError
PyExc_FileNotFoundError FileNotFoundError
PyExc_FloatingPointError FloatingPointError
PyExc_GeneratorExit GeneratorExit
PyExc_ImportError ImportError
PyExc_IndentationError IndentationError
PyExc_IndexError IndexError
PyExc_InterruptedError InterruptedError
PyExc_IsADirectoryError IsADirectoryError
PyExc_KeyError KeyError
PyExc_KeyboardInterrupt KeyboardInterrupt
PyExc_LookupError LookupError (1)
PyExc_MemoryError MemoryError
PyExc_ModuleNotFoundError ModuleNotFoundError
PyExc_NameError NameError
PyExc_NotADirectoryError NotADirectoryError
PyExc_NotImplementedError NotImplementedError
PyExc_OSError OSError (1)
PyExc_OverflowError OverflowError
PyExc_PermissionError PermissionError
PyExc_ProcessLookupError ProcessLookupError
PyExc_RecursionError RecursionError
PyExc_ReferenceError ReferenceError (2)
PyExc_RuntimeError RuntimeError
PyExc_StopAsyncIteration StopAsyncIteration
PyExc_StopIteration StopIteration
PyExc_SyntaxError SyntaxError
PyExc_SystemError SystemError
PyExc_SystemExit SystemExit
PyExc_TabError TabError
PyExc_TimeoutError TimeoutError
PyExc_TypeError TypeError
PyExc_UnboundLocalError UnboundLocalError
PyExc_UnicodeDecodeError UnicodeDecodeError
PyExc_UnicodeEncodeError UnicodeEncodeError
PyExc_UnicodeError UnicodeError
PyExc_UnicodeTranslateError UnicodeTranslateError
PyExc_ValueError ValueError
PyExc_ZeroDivisionError ZeroDivisionError

バージョン3.3の新機能: PyExc_BlockingIOErrorPyExc_BrokenPipeErrorPyExc_ChildProcessErrorPyExc_ConnectionErrorPyExc_ConnectionAbortedError、 [ X88X]、PyExc_ConnectionResetErrorPyExc_FileExistsErrorPyExc_FileNotFoundErrorPyExc_InterruptedErrorPyExc_IsADirectoryErrorPyExc_NotADirectoryError、 [X172X ]、PyExc_ProcessLookupErrorPyExc_TimeoutErrorは、 PEP 3151 に続いて導入されました。


バージョン3.5の新機能: PyExc_StopAsyncIterationおよびPyExc_RecursionError


バージョン3.6の新機能: PyExc_ModuleNotFoundError


これらはPyExc_OSErrorの互換性エイリアスです。

C名 ノート
PyExc_EnvironmentError
PyExc_IOError
PyExc_WindowsError (3)

バージョン3.3で変更:これらのエイリアスは以前は個別の例外タイプでした。


ノート:

  1. これは、他の標準例外の基本クラスです。
  2. Windowsでのみ定義されています。 プリプロセッサマクロMS_WINDOWSが定義されていることをテストして、これを使用するコードを保護します。


標準の警告カテゴリ

すべての標準Python警告カテゴリは、名前がPyExc_の後にPython例外名が続くグローバル変数として使用できます。 これらのタイプは PyObject * です。 それらはすべてクラスオブジェクトです。 完全を期すために、ここにすべての変数があります:

C名 Python名 ノート
PyExc_Warning Warning (1)
PyExc_BytesWarning BytesWarning
PyExc_DeprecationWarning DeprecationWarning
PyExc_FutureWarning FutureWarning
PyExc_ImportWarning ImportWarning
PyExc_PendingDeprecationWarning PendingDeprecationWarning
PyExc_ResourceWarning ResourceWarning
PyExc_RuntimeWarning RuntimeWarning
PyExc_SyntaxWarning SyntaxWarning
PyExc_UnicodeWarning UnicodeWarning
PyExc_UserWarning UserWarning

バージョン3.2の新機能: PyExc_ResourceWarning


ノート:

  1. これは、他の標準的な警告カテゴリの基本クラスです。