LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 219|回复: 0

查询错误指示器

[复制链接]
发表于 2024-1-22 18:26:32 | 显示全部楼层 |阅读模式


PyObject *PyErr_Occurred()
返回值:借入的引用。 属于 稳定 ABI.
测试是否设置了错误指示器。 如已设置,则返回异常 type (传给对某个 PyErr_Set* 函数或 PyErr_Restore() 的最后一次调用的第一个参数)。 如未设置,则返回 NULL。 你并不会拥有对返回值的引用,因此你不需要对它执行 Py_DECREF()。

调用时必须持有GIL。

备注 不要将返回值与特定的异常进行比较;请改为使用 PyErr_ExceptionMatches(),如下所示。 (比较很容易失败因为对于类异常来说,异常可能是一个实例而不是类,或者它可能是预期的异常的一个子类。)
int PyErr_ExceptionMatches(PyObject *exc)
属于 稳定 ABI.
等价于 PyErr_GivenExceptionMatches(PyErr_Occurred(), exc)。 此函数应当只在实际设置了异常时才被调用;如果没有任何异常被引发则将发生非法内存访问。

int PyErr_GivenExceptionMatches(PyObject *given, PyObject *exc)
属于 稳定 ABI.
如果 given 异常与 exc 中的异常类型相匹配则返回真值。 如果 exc 是一个类对象,则当 given 是一个子类的实例时也将返回真值。 如果 exc 是一个元组,则该元组(以及递归的子元组)中的所有异常类型都将被搜索进行匹配。

PyObject *PyErr_GetRaisedException(void)
返回值:新的引用。 属于 稳定 ABI 自 3.12 版开始.
返回当前被引发的异常,同时清除错误指示器。 如果错误指示器尚未设置则返回 NULL。

此函数会被需要捕获异常的代码,或需要临时保存和恢复错误指示器的代码所使用。

例如:

{
   PyObject *exc = PyErr_GetRaisedException();

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

   PyErr_SetRaisedException(exc);
}
参见 PyErr_GetHandledException(),保存当前正在处理的异常。
在 3.12 版本加入.

void PyErr_SetRaisedException(PyObject *exc)
属于 稳定 ABI 自 3.12 版开始.
将 exc 设为当前被引发的异常,如果已设置则清空现有的异常。

警告 此调用将偷取一个对 exc 的引用,它必须是一个有效的异常。
在 3.12 版本加入.

void PyErr_Fetch(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)
属于 稳定 ABI.
自 3.12 版本弃用: 使用 PyErr_GetRaisedException() 代替。

将错误指示符提取到三个变量中并传递其地址。 如果未设置错误指示符,则将三个变量都设为 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)
属于 稳定 ABI.
自 3.12 版本弃用: 请改用 PyErr_SetRaisedException()。

根据 type, value 和 traceback 这三个对象设置错误指示符,如果已设置了错误指示符则先清除它。如果三个对象均为 NULL,则清除错误指示符。 请不要传入 NULL 类型和非 NULL 的值或回溯。 异常类型应当是一个类。 请不要传入无效的异常类型或值。 (违反这些规则将导致微妙的后继问题。) 此调用会带走对每个对象的引用:你必须在调用之前拥有对每个对象的引用并且在调用之后你将不再拥有这些引用。 (如果你不理解这一点,就不要使用此函数。 勿谓言之不预。)

备注 此函数通常只被需要临时保存和恢复错误指示符的旧代码所使用。 请使用 PyErr_Fetch() 来保存当前的错误指示符。
void PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
属于 稳定 ABI.
自 3.12 版本弃用: 请改用 PyErr_GetRaisedException(),以避免任何可能的去正规化。

在特定情况下,下面 PyErr_Fetch() 所返回的值可以是“非正规化的”,即 *exc 是一个类对象而 *val 不是同一个类的实例。 在这种情况下此函数可以被用来实例化类。 如果值已经是正规化的,则不做任何操作。 实现这种延迟正规化是为了提升性能。

备注 此函数 不会 隐式地在异常值上设置 __traceback__ 属性。 如果想要适当地设置回溯,还需要以下附加代码片段:
if (tb != NULL) {
  PyException_SetTraceback(val, tb);
}
PyObject *PyErr_GetHandledException(void)
属于 稳定 ABI 自 3.11 版开始.
提取激活的异常实例,就如 sys.exception() 所返回的一样。 这是指一个 已被捕获 的异常,而不是刚被引发的异常。 返回一个指向该异常的新引用或者 NULL。 不会修改解释器的异常状态。 Does not modify the interpreter's exception state.

备注 此函数通常不会被需要处理异常的代码所使用。 它可被使用的场合是当代码需要临时保存并恢复异常状态的时候。 请使用 PyErr_SetHandledException() 来恢复或清除异常状态。
在 3.11 版本加入.

void PyErr_SetHandledException(PyObject *exc)
属于 稳定 ABI 自 3.11 版开始.
设置激活的异常,就是从 sys.exception() 所获得的。 这是指一个 已被捕获 的异常,而不是刚被引发的异常。 要清空异常状态,请传入 NULL。

备注 此函数通常不会被需要处理异常的代码所使用。 它被使用的场合是在代码需要临时保存并恢复异常状态的时候。 请使用 PyErr_GetHandledException() 来获取异常状态。
在 3.11 版本加入.

void PyErr_GetExcInfo(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)
属于 稳定 ABI 自 3.7 版开始.
提取旧式的异常信息表示形式,就是从 sys.exc_info() 所获得的。 这是指一个 已被捕获 的异常,而不是刚被引发的异常。 返回分别指向三个对象的新引用,其中任何一个都可以为 NULL。 不会修改异常信息的状态。 此函数是为了向下兼容而保留的。 更推荐使用 PyErr_GetHandledException()。

备注 此函数通常不会被需要处理异常的代码所使用。 它被使用的场合是在代码需要临时保存并恢复异常状态的时候。 请使用 PyErr_SetExcInfo() 来恢复或清除异常状态。
在 3.3 版本加入.

void PyErr_SetExcInfo(PyObject *type, PyObject *value, PyObject *traceback)
属于 稳定 ABI 自 3.7 版开始.
设置异常信息,就是从 sys.exc_info() 所获得的,这是指一个 已被捕获 的异常,而不是刚被引发的异常。 此函数会偷取对参数的引用。 要清空异常状态,请为所有三个参数传入 NULL。 此函数是为了向下兼容而保留的。 更推荐使用 PyErr_SetHandledException()。

备注 此函数通常不会被需要处理异常的代码所使用。 它被使用的场合是在代码需要临时保存并恢复异常状态的情况。 请使用 PyErr_GetExcInfo() 来读取异常状态。
在 3.3 版本加入.

在 3.11 版本发生变更: type 和 traceback 参数已不再被使用并且可以为 NULL。 解释器现在会根据异常实例(即 value 参数)来推断出它们。 此函数仍然会偷取对所有三个参数的引用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表