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_typesys.last_valuesys.last_traceback打印异常的类型,值和回溯。

void PyErr_Print()

PyErr_PrintEx(1)的别名。

void PyErr_WriteUnraisable(PyObject *obj)

当设置了异常时,此实用程序函数会向sys.stderr打印警告消息,但解释器不可能实际引发异常。例如,当__del__()方法中发生异常时,将使用此方法。

该函数使用单个参数obj调用,该参数标识发生不可疑异常的上下文。如果可能,将在警告消息中打印obj的repr。

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中的新功能。

void PyErr_SetNone(PyObject *type)

这是PyErr_SetObject(类型, Py_None)的缩写。

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的方便功能。如果使用0ierr调用,则会调用GetLastError()的调用返回的错误代码。它调用Win32函数FormatMessage()来检索由ierrGetLastError()给出的错误代码的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 be NULL, will be set as the ImportError‘s respective name and path 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)

发出警告消息。类别参数是警告类别(见下文)或NULLmessage参数是一个UTF-8编码的字符串。stack_level是给出多个堆栈帧的正数;将从当前执行的那个堆栈帧中的代码行发出警告。1的stack_level是调用PyErr_WarnEx()的函数,2是上面的函数,等等。

警告类别必须是Warning的子类;默认警告类别为RuntimeWarning标准的Python警告类别可用作名称为PyExc_的全局变量,后跟Python异常名称。这些类型为PyObject*;它们都是类对象。Their names are PyExc_Warning, PyExc_UserWarning, PyExc_UnicodeWarning, PyExc_DeprecationWarning, PyExc_SyntaxWarning, PyExc_RuntimeWarning, and PyExc_FutureWarning. PyExc_WarningPyExc_Exception的子类;其他警告类别是PyExc_Warning的子类。

有关警告控制的信息,请参阅命令行文档中warnings模块和-W选项的文档。没有用于警告控制的C API。

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

int PyException_SetTraceback(PyObject *ex, PyObject *tb)

将与异常相关联的跟踪设置为tb使用Py_None清除它。

PyObject* PyException_GetContext(PyObject *ex)

返回与异常相关联的上下文(作为另一个异常处理例程ex),作为从Python到__context__可访问的新引用。如果没有上下文相关联,则返回NULL

void PyException_SetContext(PyObject *ex, PyObject *ctx)

将与异常相关联的上下文设置为ctx使用NULL将其清除。没有类型检查以确保ctx是一个例外实例。这会窃取对ctx的引用。

PyObject* PyException_GetCause(PyObject *ex)

通过提高 ... 设置的原因(例外实例或None ...)作为新引用,可通过__cause__从Python访问。

void PyException_SetCause(PyObject *ex, PyObject *cause)

将与异常相关的原因设置为导致使用NULL将其清除。没有类型检查以确保原因是实例或None这会窃取对原因的引用。

__suppress_context__由此函数隐式设置为True

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 endreason编码原因是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 endreason编码原因是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 reasonreason是一个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

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

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_BaseExceptionBaseException(1)
PyExc_ExceptionException(1)
PyExc_ArithmeticErrorArithmeticError(1)
PyExc_LookupErrorLookupError(1)
PyExc_AssertionErrorAssertionError
PyExc_AttributeErrorAttributeError
PyExc_BlockingIOErrorBlockingIOError
PyExc_BrokenPipeErrorBrokenPipeError
PyExc_ChildProcessErrorChildProcessError
PyExc_ConnectionErrorConnectionError
PyExc_ConnectionAbortedErrorConnectionAbortedError
PyExc_ConnectionRefusedErrorConnectionRefusedError
PyExc_ConnectionResetErrorConnectionResetError
PyExc_FileExistsErrorFileExistsError
PyExc_FileNotFoundErrorFileNotFoundError
PyExc_EOFErrorEOFError
PyExc_FloatingPointErrorFloatingPointError
PyExc_ImportErrorImportError
PyExc_IndexErrorIndexError
PyExc_InterruptedErrorInterruptedError
PyExc_IsADirectoryErrorIsADirectoryError
PyExc_KeyErrorKeyError
PyExc_KeyboardInterruptKeyboardInterrupt
PyExc_MemoryErrorMemoryError
PyExc_NameErrorNameError
PyExc_NotADirectoryErrorNotADirectoryError
PyExc_NotImplementedErrorNotImplementedError
PyExc_OSErrorOSError(1)
PyExc_OverflowErrorOverflowError
PyExc_PermissionErrorPermissionError
PyExc_ProcessLookupErrorProcessLookupError
PyExc_RecursionErrorRecursionError
PyExc_ReferenceErrorReferenceError(2)
PyExc_RuntimeErrorRuntimeError
PyExc_SyntaxErrorSyntaxError
PyExc_SystemErrorSystemError
PyExc_TimeoutErrorTimeoutError
PyExc_SystemExitSystemExit
PyExc_TypeErrorTypeError
PyExc_ValueErrorValueError
PyExc_ZeroDivisionErrorZeroDivisionError

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中更改:这些别名曾经是单独的异常类型。

笔记:

  1. 这是其他标准异常的基类。
  2. 这与weakref.ReferenceError相同。
  3. 仅在Windows上定义;通过测试定义预处理器宏MS_WINDOWS来保护使用此代码的代码。