Exception Handling¶
本章中描述的函数将让你处理和引发Python异常。理解一些Python异常处理的基础是很重要的。它的工作方式有点像POSIX errno
变量:发生的最后一个错误有一个全局指示符(每个线程)。大多数C API函数不会在成功时清除此函数,但会将其设置为指示失败时错误的原因。Most C API functions also return an error indicator, usually NULL if they are supposed to return a pointer, or -1
if they return an integer (exception: the PyArg_*()
functions return 1
for success and 0
for failure).
具体地,错误指示符包括三个对象指针:异常的类型,异常的值和追溯对象。任何这些指针可以是NULL如果未设置(虽然一些组合是禁止的,例如,如果异常类型为NULL,您不能有非NULL回溯)。
当一个函数必须失败,因为它调用的一些函数失败,它通常不设置错误指示器;它调用的函数已经设置了它。它负责处理错误和清除异常,或者清理它保存的任何资源(例如对象引用或内存分配)后返回;如果它不准备处理错误,它应该不正常继续。如果由于错误返回,重要的是向调用者指示已经设置错误。如果错误未被处理或仔细传播,对Python / C API的其他调用可能不会按预期运行,并且可能会以神秘的方式失败。
注意
错误指示符不是 sys.exc_info()
的结果。前者对应于尚未捕获(因此仍在传播)的异常,而后者在捕获(因此已停止传播)后返回异常。
Printing and clearing¶
- void
PyErr_Clear
()¶ 清除错误指示灯。如果错误指示器未设置,则没有效果。
- void
PyErr_PrintEx
(int set_sys_last_vars)¶ 将标准回溯打印到
sys.stderr
并清除错误指示符。仅在设置错误指示灯时调用此功能。(否则会导致致命错误!)如果set_sys_last_vars不为零,则变量
sys.last_type
,sys.last_value
和sys.last_traceback
打印异常的类型,值和回溯。
- void
PyErr_Print
()¶ PyErr_PrintEx(1)
的别名。
Raising exceptions¶
这些功能帮助您设置当前线程的错误指示器。为了方便起见,这些函数中的一些函数总是返回一个NULL指针,用于return
语句。
- void
PyErr_SetString
(PyObject *type, const char *message)¶ 这是设置错误指示灯的最常见方法。第一个参数指定异常类型;它通常是标准例外之一,例如。
PyExc_RuntimeError
。您不需要增加其引用计数。第二个参数是错误消息;它从'utf-8
'解码。
- void
PyErr_SetObject
(PyObject *type, PyObject *value)¶ 此函数类似于
PyErr_SetString()
,但允许您为异常的“值”指定任意的Python对象。
- PyObject*
PyErr_Format
(PyObject *exception, const char *format, ...)¶ - 返回值:始终为NULL。
此函数设置错误指示符并返回NULL。异常应该是一个Python异常类。格式和后续参数帮助格式化错误消息;它们具有与
PyUnicode_FromFormat()
中相同的含义和值。格式是ASCII编码的字符串。
- PyObject*
PyErr_FormatV
(PyObject *exception, const char *format, va_list vargs)¶ - 返回值:始终为NULL。
与
PyErr_Format()
相同,但采用va_list
参数,而不是可变数量的参数。版本3.5中的新功能。
- int
PyErr_BadArgument
()¶ 这是
PyErr_SetString(PyExc_TypeError, 消息)
的简写,其中消息表示调用了内建操作有一个非法的论点。它主要用于内部使用。
- PyObject*
PyErr_NoMemory
()¶ - 返回值:始终为NULL。
这是
PyErr_SetNone(PyExc_MemoryError)
的缩写;它返回NULL,因此对象分配函数可以在内存耗尽时写入return PyErr_NoMemory();
- PyObject*
PyErr_SetFromErrno
(PyObject *type)¶ - 返回值:始终为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,则将其传递给/ t5>作为第三参数。在OSError
异常的情况下,这用于定义异常实例的filename
属性。
- PyObject*
PyErr_SetFromErrnoWithFilenameObjects
(PyObject *type, PyObject *filenameObject, PyObject *filenameObject2)¶ 类似于
PyErr_SetFromErrnoWithFilenameObject()
,但是需要第二个filename对象,用于在需要两个文件名的函数失败时引发错误。版本3.4中的新功能。
- PyObject*
PyErr_SetFromErrnoWithFilename
(PyObject *type, const char *filename)¶ - 返回值:始终为NULL。
类似于
PyErr_SetFromErrnoWithFilenameObject()
,但文件名以C字符串的形式给出。filename是从文件系统编码(os.fsdecode()
)解码的。
- PyObject*
PyErr_SetFromWindowsErr
(int ierr)¶ - 返回值:始终为NULL。
这是引发
WindowsError
的方便功能。如果使用0
的ierr调用,则会调用GetLastError()
的调用返回的错误代码。它调用Win32函数FormatMessage()
来检索由ierr或GetLastError()
给出的错误代码的Windows描述,然后它构造一个元组对象,其第一项是ierr值,其第二项是相应的错误消息(从FormatMessage()
获得),然后调用PyErr_SetObject PyExc_WindowsError, object)
。此函数始终返回NULL。可用性:Windows。
- PyObject*
PyErr_SetExcFromWindowsErr
(PyObject *type, int ierr)¶ - 返回值:始终为NULL。
类似于
PyErr_SetFromWindowsErr()
,带有指定要引发的异常类型的附加参数。可用性:Windows。
- PyObject*
PyErr_SetFromWindowsErrWithFilename
(int ierr, const char *filename)¶ - 返回值:始终为NULL。
类似于
PyErr_SetFromWindowsErrWithFilenameObject()
,但文件名以C字符串的形式给出。filename是从文件系统编码(os.fsdecode()
)解码的。可用性:Windows。
- PyObject*
PyErr_SetExcFromWindowsErrWithFilenameObject
(PyObject *type, int ierr, PyObject *filename)¶ 类似于
PyErr_SetFromWindowsErrWithFilenameObject()
,带有指定要引发的异常类型的附加参数。可用性:Windows。
- PyObject*
PyErr_SetExcFromWindowsErrWithFilenameObjects
(PyObject *type, int ierr, PyObject *filename, PyObject *filename2)¶ 类似于
PyErr_SetExcFromWindowsErrWithFilenameObject()
,但接受第二个filename对象。可用性:Windows。版本3.4中的新功能。
- PyObject*
PyErr_SetExcFromWindowsErrWithFilename
(PyObject *type, int ierr, const char *filename)¶ - 返回值:始终为NULL。
类似于
PyErr_SetFromWindowsErrWithFilename()
,带有指定要引发的异常类型的附加参数。可用性:Windows。
- PyObject*
PyErr_SetImportError
(PyObject *msg, PyObject *name, PyObject *path)¶ 这是引导
ImportError
的便利函数。msg将被设置为异常的消息字符串。name and path, both of which can beNULL
, will be set as theImportError
‘s respectivename
andpath
attributes.版本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, 消息)
的简写,其中消息表示内部操作一个Python / C API函数)被一个非法参数调用。它主要用于内部使用。
Issuing warnings¶
使用这些函数从C代码发出警告。它们镜像由Python warnings
模块导出的类似函数。它们通常向sys.stderr打印警告消息;然而,还可能的是,用户已经指定警告将被变成错误,并且在这种情况下,它们将引发异常。还可能的是,由于警告机械的问题,功能引发异常。如果没有引发异常,则返回值为0
,如果引发异常,返回值为-1
。(不能确定警告消息是否实际打印,也不能确定异常的原因;这是有意的。)如果引发异常,调用者应该执行其正常的异常处理(例如,Py_DECREF()
拥有的引用并返回错误值)。
- int
PyErr_WarnEx
(PyObject *category, const char *message, Py_ssize_t stack_level)¶ 发出警告消息。类别参数是警告类别(见下文)或NULL; message参数是一个UTF-8编码的字符串。stack_level是给出多个堆栈帧的正数;将从当前执行的那个堆栈帧中的代码行发出警告。1的stack_level是调用
PyErr_WarnEx()
的函数,2是上面的函数,等等。警告类别必须是
Warning
的子类;默认警告类别为RuntimeWarning
。标准的Python警告类别可用作名称为PyExc_
的全局变量,后跟Python异常名称。这些类型为PyObject*
;它们都是类对象。Their names arePyExc_Warning
,PyExc_UserWarning
,PyExc_UnicodeWarning
,PyExc_DeprecationWarning
,PyExc_SyntaxWarning
,PyExc_RuntimeWarning
, andPyExc_FutureWarning
.PyExc_Warning
是PyExc_Exception
的子类;其他警告类别是PyExc_Warning
的子类。
- int
PyErr_WarnExplicitObject
(PyObject *category, PyObject *message, PyObject *filename, int lineno, PyObject *module, PyObject *registry)¶ 发出警告消息,并显式控制所有警告属性。这是一个围绕Python函数
warnings.warn_explicit()
的简单包装,有关详细信息,请参阅。模块和注册表参数可以设置为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编码字符串,filename文件系统编码(os.fsdecode()
)。
- int
PyErr_WarnFormat
(PyObject *category, Py_ssize_t stack_level, const char *format, ...)¶ 函数类似于
PyErr_WarnEx()
,但使用PyUnicode_FromFormat()
格式化警告消息。格式是ASCII编码的字符串。版本3.2中的新功能。
Querying the error indicator¶
- PyObject*
PyErr_Occurred
()¶ - 返回值:借用引用。
测试错误指示灯是否设置。如果设置,则返回异常类型(上次调用
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)¶ 如果给定异常与exc中的异常类型匹配,则返回true。如果exc是类对象,则在给定是子类的实例时,这也返回true。如果exc是元组,则搜索元组中的所有异常类型(以及递归地在子元组中)以寻找匹配。
- void
PyErr_Fetch
(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)¶ 将错误指示符恢复为三个传递地址的变量。如果未设置错误指示器,请将所有三个变量设置为NULL。如果设置,它将被清除,并且您拥有对检索的每个对象的引用。即使类型对象不是,value和traceback对象也可以是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)¶ 从三个对象设置错误指示器。如果错误指示灯已经设置,它将首先被清除。如果对象为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。不修改异常信息状态。注意
此函数通常不由要处理异常的代码使用。相反,它可以在代码需要保存和临时恢复异常状态时使用。使用
PyErr_SetExcInfo()
恢复或清除异常状态。版本3.3中的新功能。
- void
PyErr_SetExcInfo
(PyObject *type, PyObject *value, PyObject *traceback)¶ 设置异常信息,如从
sys.exc_info()
中所知。这指的是已捕获的异常,而不是刚刚引发的异常。此函数窃取参数的引用。要清除异常状态,请对所有三个参数传递NULL。有关三个参数的一般规则,请参见PyErr_Restore()
。注意
此函数通常不由要处理异常的代码使用。相反,它可以在代码需要保存和临时恢复异常状态时使用。使用
PyErr_GetExcInfo()
读取异常状态。版本3.3中的新功能。
Signal Handling¶
- int
PyErr_CheckSignals
()¶ 这个函数与Python的信号处理交互。它检查信号是否已经发送到进程,如果是,则调用相应的信号处理程序。如果支持
signal
模块,则可以调用用Python编写的信号处理程序。在所有情况下,SIGINT
的默认效果是引发KeyboardInterrupt
异常。如果出现异常,则设置错误指示符,函数返回-1
;否则该函数返回0
。如果先前设置了错误指示符,则可以或不可以清除错误指示符。
- void
PyErr_SetInterrupt
()¶ 此函数模拟
SIGINT
信号到达的效果 - 下次调用PyErr_CheckSignals()
时,将产生KeyboardInterrupt
。它可以被称为不保持解释器锁。
- int
PySignal_SetWakeupFd
(int fd)¶ 该效用函数指定一个文件描述器,每当接收到信号时,信号号被写入一个单字节。fd必须是非阻塞的。它返回上一个这样的文件描述器。
值
-1
禁用该功能;这是初始状态。这相当于Python中的signal.set_wakeup_fd()
,但没有任何错误检查。fd应为有效的文件描述器。该函数只能从主线程调用。在3.5版本中更改:在Windows上,此函数现在还支持套接字句柄。
Exception Classes¶
- PyObject*
PyErr_NewException
(const char *name, PyObject *base, PyObject *dict)¶ - 返回值:新引用。
此效用函数创建并返回一个新的异常类。name参数必须是新异常的名称,即
module.classname
形式的C字符串。基础和dict参数通常为NULL。这将创建一个从Exception
(在C中作为PyExc_Exception
可访问)派生的类对象。新类的
__module__
属性设置为name参数的第一部分(到最后一个点),类名设置为最后一个部分在最后一个点之后)。base参数可用于指定备用基类;它可以只是一个类或一个元组的类。dict参数可用于指定类变量和方法的字典。
- PyObject*
PyErr_NewExceptionWithDoc
(const char *name, const char *doc, PyObject *base, PyObject *dict)¶ - 返回值:新引用。
与
PyErr_NewException()
相同,只是新的异常类可以很容易地被赋予一个docstring:如果doc是非NULL用作异常类的docstring。版本3.2中的新功能。
Exception Objects¶
- PyObject*
PyException_GetTraceback
(PyObject *ex)¶ - 返回值:新引用。
将与异常相关联的跟踪返回为新引用,可从Python通过
__traceback__
访问。如果没有跟踪关联,则返回NULL。
- PyObject*
PyException_GetContext
(PyObject *ex)¶ 返回与异常相关联的上下文(作为另一个异常处理例程ex),作为从Python到
__context__
可访问的新引用。如果没有上下文相关联,则返回NULL。
- void
PyException_SetContext
(PyObject *ex, PyObject *ctx)¶ 将与异常相关联的上下文设置为ctx。使用NULL将其清除。没有类型检查以确保ctx是一个例外实例。这会窃取对ctx的引用。
Unicode Exception Objects¶
以下函数用于从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)¶ 使用属性编码,对象,长度,开始创建
UnicodeDecodeError
end和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)¶ 使用属性编码,对象,长度,开始创建
UnicodeEncodeError
end和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)¶ 使用属性对象,长度,开始,结束创建
UnicodeTranslateError
reason。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)¶ 返回给定异常对象的对象属性。
- 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
。
- 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
。
Recursion Control¶
这两个函数提供了一种在C级执行安全递归调用的方法,在核心模块和扩展模块中。如果递归代码不一定调用Python代码(自动跟踪其递归深度),则需要使用它们。
- int
Py_EnterRecursiveCall
(const char *where)¶ 标记将要执行递归C级调用的点。
如果定义
USE_STACKCHECK
,此函数将使用PyOS_CheckStack()
检查操作系统堆栈是否溢出。在这种情况下,它会设置MemoryError
并返回非零值。然后函数检查是否达到递归限制。如果是这种情况,将设置
RecursionError
并返回非零值。否则返回零。其中应该是 t> 实例 检查“中的
”
连接到由递归深度限制引起的RecursionError
消息。
- void
Py_LeaveRecursiveCall
()¶ 结束
Py_EnterRecursiveCall()
。对于Py_EnterRecursiveCall()
的每个成功调用,必须调用一次。
为容器类型正确实现tp_repr
需要特殊的递归处理。除了保护堆栈,tp_repr
还需要跟踪对象以防止循环。以下两个函数便于实现此功能。实际上,这些是等效于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()
的每次调用,必须调用一次。
Standard Exceptions¶
所有标准Python异常都可用作名称为PyExc_
的全局变量,后跟Python异常名称。这些类型为PyObject*
;它们都是类对象。为了完整性,这里有所有的变量:
C名称 | Python名称 | 笔记 |
---|---|---|
PyExc_BaseException | BaseException | (1) |
PyExc_Exception | Exception | (1) |
PyExc_ArithmeticError | ArithmeticError | (1) |
PyExc_LookupError | LookupError | (1) |
PyExc_AssertionError | AssertionError | |
PyExc_AttributeError | AttributeError | |
PyExc_BlockingIOError | BlockingIOError | |
PyExc_BrokenPipeError | BrokenPipeError | |
PyExc_ChildProcessError | ChildProcessError | |
PyExc_ConnectionError | ConnectionError | |
PyExc_ConnectionAbortedError | ConnectionAbortedError | |
PyExc_ConnectionRefusedError | ConnectionRefusedError | |
PyExc_ConnectionResetError | ConnectionResetError | |
PyExc_FileExistsError | FileExistsError | |
PyExc_FileNotFoundError | FileNotFoundError | |
PyExc_EOFError | EOFError | |
PyExc_FloatingPointError | FloatingPointError | |
PyExc_ImportError | ImportError | |
PyExc_IndexError | IndexError | |
PyExc_InterruptedError | InterruptedError | |
PyExc_IsADirectoryError | IsADirectoryError | |
PyExc_KeyError | KeyError | |
PyExc_KeyboardInterrupt | KeyboardInterrupt | |
PyExc_MemoryError | MemoryError | |
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_SyntaxError | SyntaxError | |
PyExc_SystemError | SystemError | |
PyExc_TimeoutError | TimeoutError | |
PyExc_SystemExit | SystemExit | |
PyExc_TypeError | TypeError | |
PyExc_ValueError | ValueError | |
PyExc_ZeroDivisionError | ZeroDivisionError |
New in version 3.3: 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
and PyExc_TimeoutError
were introduced following PEP 3151.
新版本3.5: PyExc_RecursionError
。
这些是PyExc_OSError
的兼容性别名:
C名称 | 笔记 |
---|---|
PyExc_EnvironmentError | |
PyExc_IOError | |
PyExc_WindowsError | (3) |
在版本3.3中更改:这些别名曾经是单独的异常类型。
笔记:
- 这是其他标准异常的基类。
- 这与
weakref.ReferenceError
相同。 - 仅在Windows上定义;通过测试定义预处理器宏
MS_WINDOWS
来保护使用此代码的代码。