The functions described in this chapter will let you handle and raise Python exceptions. It is important to understand some of the basics of Python exception handling. It works somewhat like the Unix
errno
variable: there is a global indicator (per thread) of the last error that occurred. Most functions don’t clear this on success, but will set it to indicate the cause of the error on failure. Most functions also return an error indicator, usually
NULL
若假设它们要返回指针,或者
-1
若它们返回整数 (例外:
PyArg_*()
函数返回
1
对于成功和
0
对于故障)。
当函数因调用的某个函数失败而必须失败时,一般不设置错误指示器;它调用的函数已有设置。它负责处理错误和清零异常或在清理它保持的任何资源后返回 (譬如:对象引用或内存分配);它应该 not 继续通常,若不准备处理错误。若由于错误而返回,重要的是向调用者指示有设置错误。若错误未被处理或被小心谨慎地传播,对 Python/C API 的额外调用可能没有如打算般的行为,且可能以神秘方式失败。
The error indicator consists of three Python objects corresponding to the Python variables
sys.exc_type
,
sys.exc_value
and
sys.exc_traceback
. API functions exist to interact with the error indicator in various ways. There is a separate error indicator for each thread.
PyErr_PrintEx
(
int
set_sys_last_vars
)
¶
将标准回溯打印到
sys.stderr
and clear the error indicator.
除非
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
实例。
Call this function only when the error indicator is set. Otherwise it will cause a fatal error!
若
set_sys_last_vars
非 0,变量
sys.last_type
,
sys.last_value
and
sys.last_traceback
将被分别设为打印异常的类型、值及回溯。
PyErr_Print
(
)
¶
别名化的
PyErr_PrintEx(1)
.
PyErr_Occurred
(
)
¶
测试是否有设置错误指示器。若有设置,返回异常
type
(首自变量到最后一次调用的一
PyErr_Set*()
函数或到
PyErr_Restore()
)。若未设置,返回
NULL
。不拥有对返回值的引用,因此不需要
Py_DECREF()
它。
注意
不要将返回值与特定异常进行比较;使用
PyErr_ExceptionMatches()
代替,如下所示。(比较可能很易失败,因为异常可能是实例而不是类,在类异常的情况下,或它可能是期望异常的子类。)
PyErr_ExceptionMatches
(
PyObject
*exc
)
¶
相当于
PyErr_GivenExceptionMatches(PyErr_Occurred(), exc)
。这才应该被调用当有实际设置异常时;会发生内存访问违反若没有引发异常。
PyErr_GivenExceptionMatches
(
PyObject
*given
,
PyObject
*exc
)
¶
返回 True 若 given exception matches the exception in exc 。若 exc 是类对象,这还返回 True 当 given 是子类的实例。若 exc is a tuple, all exceptions in the tuple (and recursively in subtuples) are searched for a match.
PyErr_NormalizeException
(
PyObject
**exc,
PyObject
**val,
PyObject
**tb
)
¶
在某些情况下,值的返回通过
PyErr_Fetch()
below can be “unnormalized”, meaning that
*exc
是类对象但
*val
is not an instance of the same class. This function can be used to instantiate the class in that case. If the values are already normalized, nothing happens. The delayed normalization is implemented to improve performance.
PyErr_Clear
(
)
¶
清零错误指示器。若未设置错误指示器,则没有效果。
PyErr_Fetch
(
PyObject
**ptype
,
PyObject
**pvalue
,
PyObject
**ptraceback
)
¶
Retrieve the error indicator into three variables whose addresses are passed. If the error indicator is not set, set all three variables to NULL . If it is set, it will be cleared and you own a reference to each object retrieved. The value and traceback object may be NULL even when the type object is not.
注意
This function is normally only used by code that needs to handle exceptions or by code that needs to save and restore the error indicator temporarily.
PyErr_Restore
(
PyObject
*type
,
PyObject
*value
,
PyObject
*traceback
)
¶
Set the error indicator from the three objects. If the error indicator is already set, it is cleared first. If the objects are NULL , the error indicator is cleared. Do not pass a NULL type and non- NULL value or traceback. The exception type should be a class. Do not pass an invalid exception type or value. (Violating these rules will cause subtle problems later.) This call takes away a reference to each object: you must own a reference to each object before the call and after the call you no longer own these references. (If you don’t understand this, don’t use this function. I warned you.)
注意
This function is normally only used by code that needs to save and restore the error indicator temporarily; use
PyErr_Fetch()
to save the current exception state.
PyErr_SetString
(
PyObject
*type
, const char
*message
)
¶
这是设置错误指示器的最常见方式。首个自变量指定异常类型;它通常是标准异常之一,如
PyExc_RuntimeError
. You need not increment its reference count. The second argument is an error message; it is converted to a string object.
PyErr_SetObject
(
PyObject
*type
,
PyObject
*value
)
¶
此函数类似于
PyErr_SetString()
但允许您为异常值指定任意 Python 对象。
PyErr_Format
(
PyObject
*exception
, const char
*format
, ...
)
¶
此函数设置错误指示器并返回
NULL
.
exception
应该是 Python 异常类。
format
和后续参数帮助格式化错误消息;它们拥有相同的意义和值如在
PyString_FromFormat()
.
PyErr_BadArgument
(
)
¶
这是简写的
PyErr_SetString(PyExc_TypeError, message)
,其中
message
indicates that a built-in operation was invoked with an illegal argument. It is mostly for internal use.
PyErr_NoMemory
(
)
¶
这是简写的
PyErr_SetNone(PyExc_MemoryError)
;它返回
NULL
因此对象分配函数可以写
return PyErr_NoMemory();
当耗尽内存时。
PyErr_SetFromErrno
(
PyObject
*type
)
¶
这是方便函数以当 C 库函数返回错误时引发异常和设置 C 变量
errno
. It constructs a tuple object whose first item is the integer
errno
value and whose second item is the corresponding error message (gotten from
strerror()
), and then calls
PyErr_SetObject(type, object)
. On Unix, when the
errno
value is
EINTR
, indicating an interrupted system call, this calls
PyErr_CheckSignals()
, and if that set the error indicator, leaves it set to that. The function always returns
NULL
, so a wrapper function around a system call can write
return PyErr_SetFromErrno(type);
when the system call returns an error.
PyErr_SetFromErrnoWithFilenameObject
(
PyObject
*type
,
PyObject
*filenameObject
)
¶
类似于
PyErr_SetFromErrno()
, with the additional behavior that if
filenameObject
不是
NULL
, it is passed to the constructor of
type
as a third parameter. In the case of exceptions such as
IOError
and
OSError
, this is used to define the
filename
attribute of the exception instance.
PyErr_SetFromErrnoWithFilename
(
PyObject
*type
, const char
*filename
)
¶
类似于
PyErr_SetFromErrnoWithFilenameObject()
, but the filename is given as a C string.
PyErr_SetFromWindowsErr
(
int
ierr
)
¶
这是方便函数以引发
WindowsError
. If called with
ierr
of
0
, the error code returned by a call to
GetLastError()
is used instead. It calls the Win32 function
FormatMessage()
to retrieve the Windows description of error code given by
ierr
or
GetLastError()
, then it constructs a tuple object whose first item is the
ierr
value and whose second item is the corresponding error message (gotten from
FormatMessage()
), and then calls
PyErr_SetObject(PyExc_WindowsError,
object)
. This function always returns
NULL
. Availability: Windows.
PyErr_SetExcFromWindowsErr
(
PyObject
*type
, int
ierr
)
¶
类似于
PyErr_SetFromWindowsErr()
, with an additional parameter specifying the exception type to be raised. Availability: Windows.
2.3 版新增。
PyErr_SetFromWindowsErrWithFilenameObject
(
int
ierr
,
PyObject
*filenameObject
)
¶
类似于
PyErr_SetFromWindowsErr()
, with the additional behavior that if
filenameObject
不是
NULL
, it is passed to the constructor of
WindowsError
as a third parameter. Availability: Windows.
PyErr_SetFromWindowsErrWithFilename
(
int
ierr
, const char
*filename
)
¶
类似于
PyErr_SetFromWindowsErrWithFilenameObject()
, but the filename is given as a C string. Availability: Windows.
PyErr_SetExcFromWindowsErrWithFilenameObject
(
PyObject
*type
, int
ierr
,
PyObject
*filename
)
¶
类似于
PyErr_SetFromWindowsErrWithFilenameObject()
, with an additional parameter specifying the exception type to be raised. Availability: Windows.
2.3 版新增。
PyErr_SetExcFromWindowsErrWithFilename
(
PyObject
*type
, int
ierr
, const char
*filename
)
¶
类似于
PyErr_SetFromWindowsErrWithFilename()
, with an additional parameter specifying the exception type to be raised. Availability: Windows.
2.3 版新增。
PyErr_BadInternalCall
(
)
¶
这是简写的
PyErr_SetString(PyExc_SystemError, message)
,其中
message
indicates that an internal operation (e.g. a Python/C API function) was invoked with an illegal argument. It is mostly for internal use.
PyErr_WarnEx
(
PyObject
*category
, char
*message
, int
stacklevel
)
¶
Issue a warning message. The
category
argument is a warning category (see below) or
NULL
;
message
argument is a message string.
stacklevel
is a positive number giving a number of stack frames; the warning will be issued from the currently executing line of code in that stack frame. A
stacklevel
of 1 is the function calling
PyErr_WarnEx()
, 2 is the function above that, and so forth.
This function normally prints a warning message to
sys.stderr
; however, it is also possible that the user has specified that warnings are to be turned into errors, and in that case this will raise an exception. It is also possible that the function raises an exception because of a problem with the warning machinery (the implementation imports the
warnings
module to do the heavy lifting). The return value is
0
if no exception is raised, or
-1
if an exception is raised. (It is not possible to determine whether a warning message is actually printed, nor what the reason is for the exception; this is intentional.) If an exception is raised, the caller should do its normal exception handling (for example,
Py_DECREF()
owned references and return an error value).
Warning categories must be subclasses of
PyExc_Warning
;
PyExc_Warning
是子类化的
PyExc_Exception
; the default warning category is
PyExc_RuntimeWarning
. The standard Python warning categories are available as global variables whose names are enumerated at
标准警告类别
.
For information about warning control, see the documentation for the
warnings
module and the
-W
option in the command line documentation. There is no C API for warning control.
PyErr_Warn
(
PyObject
*category
, char
*message
)
¶
Issue a warning message. The
category
argument is a warning category (see below) or
NULL
;
message
argument is a message string. The warning will appear to be issued from the function calling
PyErr_Warn()
, equivalent to calling
PyErr_WarnEx()
采用
stacklevel
of 1.
Deprecated; use
PyErr_WarnEx()
代替。
PyErr_WarnExplicit
(
PyObject
*category
, const char
*message
, const char
*filename
, int
lineno
, const char
*module
,
PyObject
*registry
)
¶
Issue a warning message with explicit control over all warning attributes. This is a straightforward wrapper around the Python function
warnings.warn_explicit()
, see there for more information. The
module
and
registry
arguments may be set to
NULL
to get the default effect described there.
PyErr_WarnPy3k
(
char
*message
, int
stacklevel
)
¶
Issue a
DeprecationWarning
采用给定
message
and
stacklevel
若
Py_Py3kWarningFlag
flag is enabled.
2.6 版新增。
PyErr_CheckSignals
(
)
¶
This function interacts with Python’s signal handling. It checks whether a signal has been sent to the processes and if so, invokes the corresponding signal handler. If the
signal
module is supported, this can invoke a signal handler written in Python. In all cases, the default effect for
SIGINT
is to raise the
KeyboardInterrupt
exception. If an exception is raised the error indicator is set and the function returns
-1
;否则函数返回
0
. The error indicator may or may not be cleared if it was previously set.
PyErr_SetInterrupt
(
)
¶
This function simulates the effect of a
SIGINT
signal arriving — the next time
PyErr_CheckSignals()
is called,
KeyboardInterrupt
will be raised. It may be called without holding the interpreter lock.
PySignal_SetWakeupFd
(
int
fd
)
¶
This utility function specifies a file descriptor to which a
'\0'
byte will be written whenever a signal is received. It returns the previous such file descriptor. The value
-1
disables the feature; this is the initial state. This is equivalent to
signal.set_wakeup_fd()
in Python, but without any error checking.
fd
should be a valid file descriptor. The function should only be called from the main thread.
2.6 版新增。
PyErr_NewException
(
char
*name
,
PyObject
*base
,
PyObject
*dict
)
¶
此实用函数创建并返回新的异常类。
name
自变量必须是新异常的名称,C 字符串形式
module.classname
。
base
and
dict
自变量通常为
NULL
。这创建的类对象派生自
Exception
(在 C 中可访问按
PyExc_Exception
).
The
__module__
attribute of the new class is set to the first part (up to the last dot) of the
name
argument, and the class name is set to the last part (after the last dot). The
base
argument can be used to specify alternate base classes; it can either be only one class or a tuple of classes. The
dict
argument can be used to specify a dictionary of class variables and methods.
PyErr_NewExceptionWithDoc
(
char
*name
, char
*doc
,
PyObject
*base
,
PyObject
*dict
)
¶
如同
PyErr_NewException()
, except that the new exception class can easily be given a docstring: If
doc
为非
NULL
, it will be used as the docstring for the exception class.
2.7 版新增。
PyErr_WriteUnraisable
(
PyObject
*obj
)
¶
此实用函数将警告消息打印到
sys.stderr
当异常有设置但解释器实际引发异常不可能时。使用它,例如,当异常发生在
__del__()
方法。
调用函数采用单自变量 obj 标识发生不可引发异常的上下文。若可能,repr obj 将被打印在警告消息中。
The following functions are used to create and modify Unicode exceptions from C.
PyUnicodeDecodeError_Create
(
const char
*encoding
, const char
*object
, Py_ssize_t
length
, Py_ssize_t
start
, Py_ssize_t
end
, const char
*reason
)
¶
创建
UnicodeDecodeError
object with the attributes
encoding
,
object
,
length
,
start
,
end
and
reason
.
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
object with the attributes
encoding
,
object
,
length
,
start
,
end
and
reason
.
PyUnicodeTranslateError_Create
(
const
Py_UNICODE
*object
, Py_ssize_t
length
, Py_ssize_t
start
, Py_ssize_t
end
, const char
*reason
)
¶
创建
UnicodeTranslateError
object with the attributes
object
,
length
,
start
,
end
and
reason
.
PyUnicodeDecodeError_GetEncoding
(
PyObject
*exc
)
¶
PyUnicodeEncodeError_GetEncoding
(
PyObject
*exc
)
¶
返回 encoding 属性为给定异常对象。
PyUnicodeDecodeError_GetObject
(
PyObject
*exc
)
¶
PyUnicodeEncodeError_GetObject
(
PyObject
*exc
)
¶
PyUnicodeTranslateError_GetObject
(
PyObject
*exc
)
¶
返回 object 属性为给定异常对象。
PyUnicodeDecodeError_GetStart
(
PyObject
*exc
, Py_ssize_t
*start
)
¶
PyUnicodeEncodeError_GetStart
(
PyObject
*exc
, Py_ssize_t
*start
)
¶
PyUnicodeTranslateError_GetStart
(
PyObject
*exc
, Py_ssize_t
*start
)
¶
获取
start
attribute of the given exception object and place it into
*start
.
start
不得为
NULL
。返回
0
当成功时,
-1
当故障时。
PyUnicodeDecodeError_SetStart
(
PyObject
*exc
, Py_ssize_t
start
)
¶
PyUnicodeEncodeError_SetStart
(
PyObject
*exc
, Py_ssize_t
start
)
¶
PyUnicodeTranslateError_SetStart
(
PyObject
*exc
, Py_ssize_t
start
)
¶
设置
start
attribute of the given exception object to
start
。返回
0
当成功时,
-1
当故障时。
PyUnicodeDecodeError_GetEnd
(
PyObject
*exc
, Py_ssize_t
*end
)
¶
PyUnicodeEncodeError_GetEnd
(
PyObject
*exc
, Py_ssize_t
*end
)
¶
PyUnicodeTranslateError_GetEnd
(
PyObject
*exc
, Py_ssize_t
*end
)
¶
获取
end
attribute of the given exception object and place it into
*end
.
end
不得为
NULL
。返回
0
当成功时,
-1
当故障时。
PyUnicodeDecodeError_SetEnd
(
PyObject
*exc
, Py_ssize_t
end
)
¶
PyUnicodeEncodeError_SetEnd
(
PyObject
*exc
, Py_ssize_t
end
)
¶
PyUnicodeTranslateError_SetEnd
(
PyObject
*exc
, Py_ssize_t
end
)
¶
设置
end
attribute of the given exception object to
end
。返回
0
当成功时,
-1
当故障时。
PyUnicodeDecodeError_GetReason
(
PyObject
*exc
)
¶
PyUnicodeEncodeError_GetReason
(
PyObject
*exc
)
¶
PyUnicodeTranslateError_GetReason
(
PyObject
*exc
)
¶
返回 reason 属性为给定异常对象。
PyUnicodeDecodeError_SetReason
(
PyObject
*exc
, const char
*reason
)
¶
PyUnicodeEncodeError_SetReason
(
PyObject
*exc
, const char
*reason
)
¶
PyUnicodeTranslateError_SetReason
(
PyObject
*exc
, const char
*reason
)
¶
设置
reason
attribute of the given exception object to
reason
。返回
0
当成功时,
-1
当故障时。
These two functions provide a way to perform safe recursive calls at the C level, both in the core and in extension modules. They are needed if the recursive code does not necessarily invoke Python code (which tracks its recursion depth automatically).
Py_EnterRecursiveCall
(
const char
*where
)
¶
Marks a point where a recursive C-level call is about to be performed.
若
USE_STACKCHECK
is defined, this function checks if the OS stack overflowed using
PyOS_CheckStack()
. In this is the case, it sets a
MemoryError
and returns a nonzero value.
The function then checks if the recursion limit is reached. If this is the case, a
RuntimeError
is set and a nonzero value is returned. Otherwise, zero is returned.
where
should be a string such as
" in instance check"
to be concatenated to the
RuntimeError
message caused by the recursion depth limit.
Py_LeaveRecursiveCall
(
)
¶
Ends a
Py_EnterRecursiveCall()
. Must be called once for each
successful
invocation of
Py_EnterRecursiveCall()
.
All standard Python exceptions 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 名称 |
注意事项 |
|---|---|---|
|
|
(1), (4) | |
|
|
(1) | |
|
|
(1) | |
|
|
(1) | |
|
|
||
|
|
||
|
|
||
|
|
(1) | |
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
(1) | |
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
(2) | |
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
(5) | |
|
|
||
|
|
(3) | |
|
|
注意事项:
This is a base class for other standard exceptions.
这如同
weakref.ReferenceError
.
Only defined on Windows; protect code that uses this by testing that the preprocessor macro
MS_WINDOWS
有定义。
2.5 版新增。
Only defined on VMS; protect code that uses this by testing that the preprocessor macro
__VMS
有定义。
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 名称 |
注意事项 |
|---|---|---|
|
|
(1) | |
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
注意事项:
This is a base class for other standard warning categories.
2.6 版改变:
All exceptions to be raised or caught must be derived from
BaseException
. Trying to raise a string exception now raises
TypeError
.