On this page
Exception Handling
本章中描述的Function将使您能够处理和引发 Python 异常。了解 Python 异常处理的一些基础知识很重要。它的工作方式类似于 POSIX errno
变量:每个事件都有一个全局指示器(每个线程)。大多数 C API 函数不会在成功时清除此错误,但会对其进行设置以指示失败时错误的原因。大多数 C API 函数还会返回错误指示符,如果应该返回指针,则通常返回NULL
,如果返回整数则返回-1
(exception:PyArg_*()
函数返回1
表示成功,返回0
表示失败)。
具体来说,错误指示符由三个对象指针组成:异常的类型,异常的值和回溯对象。如果未设置,那么这些指针中的任何一个都可以为NULL
(尽管某些组合是被禁止的,例如,如果异常类型为NULL
,则不能具有非NULL
traceback)。
当某个函数由于某个函数调用失败而必须失败时,通常不会设置错误指示符。它调用的Function已经设置好了。它负责处理错误并清除异常,或者负责清除其拥有的任何资源(例如对象引用或内存分配)后返回;如果它没有准备好处理错误,则应该不continue 正常运行。如果由于错误而返回,则重要的是向呼叫者表明已设置了错误。如果未处理或未认真传播错误,则对 Python/C API 的其他调用可能无法正常运行,并且可能会以神秘方式失败。
Note
错误指示符不是sys.exc_info()的结果。前者对应于尚未捕获的异常(因此仍在传播),而后者对应于捕获到的异常(因此已停止传播)后返回异常。
打印和清除
无效
PyErr_Clear
()- 清除错误指示器。如果未设置错误指示器,则无效。
无效
PyErr_PrintEx
(int * set_sys_last_vars *)- 将标准回溯打印到
sys.stderr
,然后清除错误指示符。 除非 错误是SystemExit
,在这种情况下不会打印回溯,并且 Python 进程将退出,并返回SystemExit
实例指定的错误代码。
- 将标准回溯打印到
设置错误指示器后,仅**调用此函数。否则会导致致命错误!
如果* set_sys_last_vars *不为零,则变量sys.last_type,sys.last_value和sys.last_traceback将分别设置为打印异常的类型,值和回溯。
无效
PyErr_Print
()PyErr_PrintEx(1)
的别名。
无效
PyErr_WriteUnraisable
(PyObject ** obj *)- 使用当前异常和* obj *参数调用sys.unraisablehook()。
设置了异常后,此 Util 函数会将警告消息打印到sys.stderr
,但解释器实际上无法引发该异常。例如,在del()方法中发生异常时使用。
该函数使用单个参数* obj 进行调用,该参数标识发生了无法提出的异常的上下文。如果可能, obj *的代表将打印在警告消息中。
调用此函数时必须设置一个异常。
Raising exceptions
这些Function可帮助您设置当前线程的错误指示器。为了方便起见,其中一些函数将始终返回NULL
指针,以用于return
语句。
无效
PyErr_SetString
(PyObject *type ,const char message *)- 这是设置错误指示符的最常见方法。第一个参数指定异常类型;它通常是标准 exception 之一,例如
PyExc_RuntimeError
。您无需增加其引用计数。第二个参数是错误消息;它是从'utf-8
'解码的。
- 这是设置错误指示符的最常见方法。第一个参数指定异常类型;它通常是标准 exception 之一,例如
无效
PyErr_SetObject
(PyObject 类型,PyObject* 值*)- 此函数类似于PyErr_SetString(),但允许您为异常的“值”指定任意 Python 对象。
PyObject *
PyErr_Format
(PyObject *exception ,const char format *,...)- 返回值:始终为 NULL.
此函数设置错误指示符并返回NULL
。 * exception *应该是 Python 异常类。 * format *和后续参数有助于格式化错误消息;它们的含义和值与PyUnicode_FromFormat()相同。 * format *是 ASCII 编码的字符串。
与PyErr_Format()相同,但采用va_list
参数而不是可变数量的参数。
3.5 版中的新Function。
无效
PyErr_SetNone
(PyObject *类型)- 这是
PyErr_SetObject(type, Py_None)
的简写。
- 这是
int
PyErr_BadArgument
()- 这是
PyErr_SetString(PyExc_TypeError, message)
的简写,其中* message *表示使用非法参数调用了内置操作。它主要供内部使用。
- 这是
PyObject*
PyErr_NoMemory
( )- 返回值:始终为 NULL.
这是PyErr_SetNone(PyExc_MemoryError)
的简写;它返回NULL
,因此对象分配函数在内存不足时可以写入return PyErr_NoMemory();
。
这是一个便利函数,可在 C 库函数返回错误并设置 C 变量errno
时引发异常。它构造一个 Tuples 对象,其第一项是整数errno
值,而第二项是相应的错误消息(从strerror()
得到),然后调用PyErr_SetObject(type, object)
。在 Unix 上,当errno
值为EINTR
时(表示系统调用已break),它将调用PyErr_CheckSignals(),如果设置了错误指示符,则将其设置为该值。该函数始终返回NULL
,因此,当系统调用返回错误时,围绕系统调用的包装器函数可以写入return PyErr_SetFromErrno(type);
。
与PyErr_SetFromErrno()相似,另外的行为是,如果* filenameObject 不是NULL
,它将作为第三个参数传递给 type *的构造函数。对于OSError异常,它用于定义异常实例的filename
属性。
- PyObject *
PyErr_SetFromErrnoWithFilenameObjects
(PyObject *type ,PyObject filenameObject *,PyObject ** filenameObject2 *)- 返回值:始终为 NULL.
与PyErr_SetFromErrnoWithFilenameObject()相似,但使用第二个文件名对象,当使用两个文件名的函数失败时引发错误。
3.4 版的新Function。
与PyErr_SetFromErrnoWithFilenameObject()相似,但文件名以 C 字符串形式给出。 * filename *从文件系统编码(os.fsdecode())解码。
- PyObject *
PyErr_SetFromWindowsErr
(int * ierr *)- 返回值:始终为 NULL.
这是提高WindowsError的便捷Function。如果以0
的* ierr 进行调用,则会使用GetLastError()
的调用返回的错误代码。它调用 Win32 函数FormatMessage()
来检索 ierr 或GetLastError()
给定的错误代码的 Windows 描述,然后构造一个 Tuples 对象,其第一项为 ierr *值,第二项为相应的错误消息(从FormatMessage()
得到),然后调用PyErr_SetObject(PyExc_WindowsError, object)
。此函数始终返回NULL
。
Availability: Windows.
与PyErr_SetFromWindowsErr()相似,带有一个附加参数,指定要引发的异常类型。
Availability: Windows.
- PyObject *
PyErr_SetFromWindowsErrWithFilename
(int * ierr *,const char ** filename *)- 返回值:始终为 NULL.
与PyErr_SetFromWindowsErrWithFilenameObject()
相似,但文件名以 C 字符串形式给出。 * filename *从文件系统编码(os.fsdecode())解码。
Availability: Windows.
- PyObject *
PyErr_SetExcFromWindowsErrWithFilenameObject
(PyObject **type ,int * ierr ,PyObject filename *)- 返回值:始终为 NULL.
与PyErr_SetFromWindowsErrWithFilenameObject()
相似,带有一个附加参数,指定要引发的异常类型。
Availability: Windows.
- PyObject *
PyErr_SetExcFromWindowsErrWithFilenameObjects
(PyObject **type ,int * ierr ,PyObject filename *,PyObject ** filename2 *)- 返回值:始终为 NULL.
与PyErr_SetExcFromWindowsErrWithFilenameObject()类似,但是接受第二个文件名对象。
Availability: Windows.
3.4 版的新Function。
- PyObject *
PyErr_SetExcFromWindowsErrWithFilename
(PyObject **type ,int * ierr ,const char filename *)- 返回值:始终为 NULL.
与PyErr_SetFromWindowsErrWithFilename()相似,带有一个附加参数,指定要引发的异常类型。
Availability: Windows.
这是提高ImportError的便捷Function。 * msg 将被设置为异常的消息字符串。可以都是NULL
的 name 和 path *将被设置为ImportError各自的name
和path
属性。
版本 3.3 中的新Function。
- 无效
PyErr_SyntaxLocationObject
(PyObject *文件名,int * lineno *,int * col_offset *)- 设置当前异常的文件,行和偏移量信息。如果当前异常不是SyntaxError,那么它将设置其他属性,这会使异常打印子系统认为该异常是SyntaxError。
3.4 版的新Function。
- 无效
PyErr_SyntaxLocationEx
(const char ** filename *,int * lineno *,int * col_offset *)- 类似于PyErr_SyntaxLocationObject(),但是* filename *是从文件系统编码(os.fsdecode())解码的字节字符串。
3.2 版中的新Function。
无效
PyErr_SyntaxLocation
(const char ** filename *,int * lineno *)- 类似于PyErr_SyntaxLocationEx(),但Ellipsis了 col_offset 参数。
无效
PyErr_BadInternalCall
()- 这是
PyErr_SetString(PyExc_SystemError, message)
的简写,其中* message *表示使用非法参数调用了内部操作(例如 Python/C API 函数)。它主要供内部使用。
- 这是
Issuing warnings
使用这些Function可以从 C 代码发出警告。它们反映了 Python warnings模块导出的类似Function。他们通常向* sys.stderr *打印警告消息;但是,用户也可能已指定警告将变为错误,在这种情况下,警告将引发异常。由于警告机制存在问题,这些Function也可能引发异常。如果未引发异常,则返回值为0
;如果引发异常,则返回值为-1
。 (无法确定是否实际打印警告消息,也不知道异常的原因;这是有意的.)如果引发异常,则调用方应执行其常规异常处理(例如,Py_DECREF()拥有的引用)并返回错误值)。
- int
PyErr_WarnEx
(PyObject *category ,const char message *,Py_ssize_t * stack_level *)- 发出警告消息。 * category *参数是警告类别(请参见下文)或
NULL
; * message *参数是 UTF-8 编码的字符串。 * stack_level *是一个正数,给出了许多堆栈帧;该警告将从该堆栈帧中当前正在执行的代码行发出。 * stack_level *为 1 是调用PyErr_WarnEx()的函数,2 是在其之上的函数,依此类推。
- 发出警告消息。 * category *参数是警告类别(请参见下文)或
警告类别必须是PyExc_Warning
的子类; PyExc_Warning
是PyExc_Exception
的子类;默认警告类别为PyExc_RuntimeWarning
。标准的 Python 警告类别可用作全局变量,其名称在标准警告类别处枚举。
有关警告控制的信息,请参阅命令行文档中warnings模块的文档和-W选项。没有用于警告控制的 C API。
- PyObject *
PyErr_SetImportErrorSubclass
(PyObject *exception ,PyObject msg *,PyObject *name ,PyObject path *)- 返回值:始终为 NULL.
类似于PyErr_SetImportError(),但此函数允许指定要引发的ImportError的子类。
3.6 版的新Function。
- int
PyErr_WarnExplicitObject
(PyObject 类别,PyObject* 消息*,PyObject 文件名,int * lineno ,PyObject 模块*,PyObject *注册表)- 发出警告消息,并明确控制所有警告属性。这是 Python 函数warnings.warn_explicit()的直接包装,请参见那里的更多信息。 * module 和 registry *参数可以设置为
NULL
以获得此处描述的默认效果。
- 发出警告消息,并明确控制所有警告属性。这是 Python 函数warnings.warn_explicit()的直接包装,请参见那里的更多信息。 * module 和 registry *参数可以设置为
3.4 版的新Function。
int
PyErr_WarnExplicit
(PyObject *category ,const char message *,const char **filename ,int * lineno ,const char module *,PyObject ** registry *)- 类似于PyErr_WarnExplicitObject(),不同之处是* message 和 module 是 UTF-8 编码的字符串,并且 filename *是从文件系统编码(os.fsdecode())解码的。
int
PyErr_WarnFormat
(PyObject **category ,Py_ssize_t * stack_level ,const char format *,...)- Function类似于PyErr_WarnEx(),但使用PyUnicode_FromFormat()格式化警告消息。 * format *是 ASCII 编码的字符串。
3.2 版中的新Function。
- int
PyErr_ResourceWarning
(PyObject **source ,Py_ssize_t * stack_level ,const char format *,...)- Function类似于PyErr_WarnFormat(),但是* category 是ResourceWarning,并将 source *传递给
warnings.WarningMessage()
。
- Function类似于PyErr_WarnFormat(),但是* category 是ResourceWarning,并将 source *传递给
3.6 版的新Function。
查询错误指示符
- PyObject*
PyErr_Occurred
( )- *返回值:借用参考。
测试是否设置了错误指示器。如果设置,则返回异常* type *(对PyErr_Set*()
函数之一或PyErr_Restore()的最后一次调用的第一个参数)。如果未设置,则返回NULL
。您没有对返回值的引用,因此不需要Py_DECREF()。
Note
不要将返回值与特定异常进行比较;改为使用PyErr_ExceptionMatches(),如下所示。 (比较很容易失败,因为在类异常的情况下,异常可能是实例而不是类,或者可能是预期异常的子类.)
int
PyErr_ExceptionMatches
(PyObject ** exc *)- 等效于
PyErr_GivenExceptionMatches(PyErr_Occurred(), exc)
。仅当实际设置了异常时才应调用此方法。如果没有引发异常,则会发生内存访问冲突。
- 等效于
int
PyErr_GivenExceptionMatches
(PyObject 已提供,PyObject* exc *)- 如果* given 异常与 exc 中的异常类型匹配,则返回 true。如果 exc 是类对象,则当 given 是子类的实例时,它也会返回 true。如果 exc *是一个 Tuples,则在该 Tuples 中(并在子 Tuples 中递归地)搜索所有匹配项。
无效
PyErr_Fetch
(PyObject *** ptype ,PyObject* * pvalue *,PyObject *** ptraceback *)- 将错误指示符检索为三个已传递地址的变量。如果未设置错误指示符,请将所有三个变量设置为
NULL
。如果已设置,它将被清除,并且您拥有对检索到的每个对象的引用。即使类型对象不是,值和 traceback 对象也可能是NULL
。
- 将错误指示符检索为三个已传递地址的变量。如果未设置错误指示符,请将所有三个变量设置为
Note
此Function通常仅由需要捕获异常的代码或需要临时保存和恢复错误指示符的代码使用,例如:
{
PyObject *type, *value, *traceback;
PyErr_Fetch(&type, &value, &traceback);
/* ... code that might produce other errors ... */
PyErr_Restore(type, value, traceback);
}
- 无效
PyErr_Restore
(PyObject 类型,PyObject* 值*,PyObject *回溯)- 从三个对象设置错误指示器。如果错误指示器已经设置,则首先将其清除。如果对象是
NULL
,则清除错误指示符。不要传递NULL
类型和非NULL
值或回溯。异常类型应该是一个类。不要传递无效的异常类型或值。 (违反这些规则将在以后引起一些细微的问题.)此调用取消了对每个对象的引用:在调用之前,您必须拥有对每个对象的引用,而在调用之后,您将不再拥有这些引用。 (如果您不了解此Function,请不要使用此Function.我警告过您.)
- 从三个对象设置错误指示器。如果错误指示器已经设置,则首先将其清除。如果对象是
Note
此Function通常仅由需要临时保存和恢复错误指示符的代码使用。使用PyErr_Fetch()保存当前的错误指示符。
- 无效
PyErr_NormalizeException
(PyObject exc,PyObject val,PyObject ** tb)- 在某些情况下,下面的PyErr_Fetch()返回的值可以是“未规范化的”,这意味着
*exc
是一个类对象,而*val
不是同一类的实例。在这种情况下,可以使用该函数实例化该类。如果值已经标准化,则什么也不会发生。实施延迟归一化以提高性能。
- 在某些情况下,下面的PyErr_Fetch()返回的值可以是“未规范化的”,这意味着
Note
该Function不会隐式地在异常值上设置__traceback__
属性。如果需要适当地设置回溯,则需要以下附加代码段:
if (tb != NULL) {
PyException_SetTraceback(val, tb);
}
- 无效
PyErr_GetExcInfo
(PyObject *** ptype ,PyObject* * pvalue *,PyObject *** ptraceback *)- 检索异常信息,如
sys.exc_info()
所示。这是指已被*捕获的异常,而不是新提出的异常。返回这三个对象的新引用,其中任何一个都可以是NULL
。不修改异常信息状态。
- 检索异常信息,如
Note
要处理异常的代码通常不使用此Function。相反,可以在需要临时保存和恢复异常状态的代码时使用它。使用PyErr_SetExcInfo()恢复或清除异常状态。
版本 3.3 中的新Function。
- 无效
PyErr_SetExcInfo
(PyObject 类型,PyObject* 值*,PyObject *回溯)- 设置 exception 信息,如
sys.exc_info()
所示。这是指已被*捕获的异常,而不是新提出的异常。该函数窃取参数的引用。要清除异常状态,请为所有三个参数传递NULL
。有关这三个参数的一般规则,请参见PyErr_Restore()。
- 设置 exception 信息,如
Note
要处理异常的代码通常不使用此Function。相反,可以在需要临时保存和恢复异常状态的代码时使用它。使用PyErr_GetExcInfo()读取异常状态。
版本 3.3 中的新Function。
Signal Handling
- int
PyErr_CheckSignals
()- 此函数与 Python 的 signal 处理交互。它检查是否已将 signal 发送到进程,如果已发送,则调用相应的 signal 处理程序。如果支持signal模块,则可以调用用 Python 编写的 signal 处理程序。在所有情况下,
SIGINT
的默认效果是引发KeyboardInterrupt异常。如果引发异常,则设置错误指示符,并且该函数返回-1
;否则函数返回0
。如果错误指示器是先前设置的,则可能会清除,也可能不会清除。
- 此函数与 Python 的 signal 处理交互。它检查是否已将 signal 发送到进程,如果已发送,则调用相应的 signal 处理程序。如果支持signal模块,则可以调用用 Python 编写的 signal 处理程序。在所有情况下,
- 无效
PyErr_SetInterrupt
()- 模拟
SIGINT
signal 到达的效果。下次调用PyErr_CheckSignals()时,将调用SIGINT
的 Pythonsignal 处理程序。
- 模拟
如果SIGINT
不是由 Python 处理的(将其设置为signal.SIG_DFL或signal.SIG_IGN),则此函数不执行任何操作。
- int
PySignal_SetWakeupFd
(int * fd *)- 该 Util 函数指定一个文件 Descriptors,每当接收到 signal 时,signal 号就作为单个字节写入其中。 * fd *必须是非阻塞的。它返回先前的此类文件 Descriptors。
值-1
禁用该Function;这是初始状态。这等效于 Python 中的signal.set_wakeup_fd(),但没有任何错误检查。 * fd *应该是有效的文件 Descriptors。该函数只能从主线程调用。
在版本 3.5 中进行了更改:在 Windows 上,该函数现在还支持套接字句柄。
Exception Classes
该 Util 函数创建并返回一个新的异常类。 * name *参数必须是新异常的名称,格式为module.classname
的 C 字符串。 * base 和 dict *参数通常是NULL
。这将创建一个从Exception派生的类对象(在 C 中可以passPyExc_Exception
访问)。
新类的__module__
属性设置为* name *参数的第一部分(直到最后一个点),而类名则设置为最后一部分(在最后一个点之后)。 * base *参数可用于指定备用 Base Class;它既可以是一个类,也可以是一组 Tuples。 * dict *参数可用于指定类变量和方法的字典。
- PyObject *
PyErr_NewExceptionWithDoc
(const char *name ,const char doc *,PyObject *base ,PyObject dict *)- 返回值:新参考.
与PyErr_NewException()相同,不同之处在于可以轻松地为新的异常类指定 docstring:如果* doc *不是NULL
,它将用作异常类的 docstring。
3.2 版中的新Function。
Exception Objects
返回与异常关联的回溯作为新引用,可以pass__traceback__
从 Python 访问。如果没有关联的回溯,则返回NULL
。
int
PyException_SetTraceback
(PyObject *ex ,PyObject tb *)- 将与异常关联的回溯设置为* tb *。使用
Py_None
清除它。
- 将与异常关联的回溯设置为* tb *。使用
PyObject *
PyException_GetContext
(PyObject ** ex *)- 返回值:新参考.
返回与异常关联的上下文(在处理过程中引起* ex *的另一个异常实例)作为新引用,可以pass__context__
从 Python 访问。如果没有关联的上下文,则返回NULL
。
无效
PyException_SetContext
(PyObject *ex ,PyObject ctx *)- 将与异常关联的上下文设置为* ctx 。使用
NULL
清除它。没有类型检查来确保 ctx 是异常实例。这窃取了对 ctx *的引用。
- 将与异常关联的上下文设置为* ctx 。使用
PyObject *
PyException_GetCause
(PyObject ** ex *)- 返回值:新参考.
返回与异常相关的原因(异常实例或None,由raise ... from ...
设置)作为新参考,可以pass__cause__
从 Python 访问。
- 无效
PyException_SetCause
(PyObject *ex ,PyObject Cause *)- 将与异常相关的原因设置为* cause 。使用
NULL
清除它。没有类型检查来确保 cause 是异常实例还是None。这窃取了对 cause *的引用。
- 将与异常相关的原因设置为* cause 。使用
此函数将__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 *)- 返回值:新参考.
使用属性* encoding , object , length , start , end 和 reason *创建一个UnicodeDecodeError对象。 * 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 *)- 返回值:新参考.
使用属性* encoding , object , length , start , end 和 reason *创建一个UnicodeEncodeError对象。 * encoding 和 reason *是 UTF-8 编码的字符串。
- 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对象。 * reason *是 UTF-8 编码的字符串。
- 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 *中。 开始不得为
NULL
。成功返回0
,失败返回-1
。
- 获取给定异常对象的* start 属性,并将其放入* start *中。 开始不得为
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
。
- 将给定异常对象的* start 属性设置为 start *。成功返回
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
。
- 获取给定异常对象的* end 属性,并将其放入* end *中。 * end *不得为
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
。
- 将给定异常对象的* end 属性设置为 end *。成功返回
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
。
- 将给定异常对象的* reason 属性设置为 reason *。成功返回
Recursion Control
这两个函数提供了一种在核心和扩展模块中以 C 级别执行安全递归调用的方法。如果递归代码不一定调用 Python 代码(自动跟踪其递归深度),则需要使用它们。
- int
Py_EnterRecursiveCall
(const char ** where *)- 标记将要执行递归 C 级调用的点。
如果定义了USE_STACKCHECK
,则此函数使用PyOS_CheckStack()检查 os 堆栈是否溢出。在这种情况下,它将设置MemoryError并返回非零值。
然后,该函数检查是否达到了递归限制。在这种情况下,将设置RecursionError并返回非零值。否则,返回零。
- where *应该是由递归深度限制引起的字符串,例如
" in instance check"
要与RecursionError消息串联。
- 无效
Py_LeaveRecursiveCall
()- 结束Py_EnterRecursiveCall()。每次对Py_EnterRecursiveCall()的“成功”调用都必须被调用一次。
为容器类型正确实现tp_repr需要特殊的递归处理。除了保护堆栈外,tp_repr还需要跟踪对象以防止循环。以下两个Function有助于实现此Function。实际上,这些是reprlib.recursive_repr()的 C 等效项。
如果对象已被处理,则该函数返回一个正整数。在这种情况下,tp_repr实现应返回指示循环的字符串对象。例如,dict个对象返回{...}
,而list对象返回[...]
。
如果达到递归限制,该函数将返回一个负整数。在这种情况下,tp_repr实现通常应返回NULL
。
否则,函数将返回零,并且tp_repr实现可以正常 continue。
- 无效
Py_ReprLeave
(PyObject *对象)- 结束Py_ReprEnter()。每次返回零的Py_ReprEnter()调用必须被调用一次。
Standard Exceptions
所有标准 Python 异常都可以用作全局变量,其名称为PyExc_
,后跟 Python 异常名称。它们的类型为PyObject*;它们都是类对象。为了完整起见,以下是所有变量:
C Name | Python Name | Notes |
---|---|---|
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 中的新Function:PyExc_BlockingIOError
,PyExc_BrokenPipeError
,PyExc_ChildProcessError
,PyExc_ConnectionError
,PyExc_ConnectionAbortedError
,PyExc_ConnectionRefusedError
,PyExc_ConnectionResetError
,PyExc_FileExistsError
,PyExc_FileNotFoundError
,PyExc_InterruptedError
,PyExc_IsADirectoryError
,PyExc_NotADirectoryError
,PyExc_PermissionError
,PyExc_ProcessLookupError
和PyExc_TimeoutError
是在 PEP 3151之后引入的。
版本 3.5 中的新Function:PyExc_StopAsyncIteration
和PyExc_RecursionError
。
3.6 版的新Function:PyExc_ModuleNotFoundError
。
这些是PyExc_OSError
的兼容性别名:
C Name | Notes |
---|---|
PyExc_EnvironmentError |
|
PyExc_IOError |
|
PyExc_WindowsError |
(3) |
在版本 3.3 中更改:这些别名曾经是单独的异常类型。
Notes:
这是其他标准异常的 Base Class。
仅在 Windows 上定义;pass测试定义了预处理程序宏
MS_WINDOWS
来保护使用此代码的代码。
标准警告类别
所有标准的 Python 警告类别都可以用作全局变量,其名称为PyExc_
,后跟 Python 异常名称。它们的类型为PyObject*;它们都是类对象。为了完整起见,以下是所有变量:
C Name | Python Name | Notes |
---|---|---|
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 中的新Function:PyExc_ResourceWarning
。
Notes:
- 这是其他标准警告类别的 Base Class。