我是靠谱客的博主 重要花瓣,最近开发中收集的这篇文章主要介绍第五章 异常处理(中)查询错误指示器信号处理Exception 类异常对象,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

异常处理

  • 查询错误指示器
  • 信号处理
  • Exception 类
  • 异常对象

查询错误指示器

  • PyObject PyErr_Occurred()
    返回值:已借用的参考资料。这是稳定的ABI的一部分。测试错误指示器是否已设置。如果设置,则返回异常类型(对PyErr_Set
    函数或PyErr_Restore()的最后一次调用的第一个参数)。如果未设置,则返回NULL。您没有对返回值的引用,因此不需要对其进行Py_DECREF()。

备注:不要将返回值与特定异常进行比较;请使用PyErr_ExceptionMatches(),如下所示。(比较很容易失败,因为在类异常的情况下,异常可能是一个实例而不是一个类,或者它可能是预期异常的一个子类。)

  • int PyErr_ExceptionMatches(PyObject *exc)
    这是稳定的ABI的一部分。相当于PyErr_GivenExceptionMatches(PyErr_Occurred(),exc)。仅在实际设置异常时调用;如果没有引发异常,则会发生内存访问冲突。
  • int PyErr_GivenExceptionMatches(PyObject *given, PyObject *exc)
    这是稳定的ABI的一部分。如果给定的异常与exc中的异常类型相匹配,则返回true。如果exc是一个类对象,当给定是子类的实例时,也返回true。如果exc是一个元组,则将搜索元组中的所有异常类型(并在子元组中递归地)以寻找匹配项。
  • void PyErr_Fetch(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)
    这是稳定的ABI的一部分。将错误指示器检索到三个已传递其地址的变量中。如果未设置错误指示器,请将所有三个变量均设置为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的一部分。设置来自这三个对象的错误指示器。如果已设置了错误指示器,则将首先清除它。如果这些对象为NULL,则会清除错误指示器。不要传递NULL类型和非NULL值或回溯。异常类型应该是一个类。不要传递无效的异常类型或值。(违反这些规则会在以后造成一些微妙的问题。)此调用带走对每个对象的引用:在调用和调用之前必须拥有对每个对象的引用,之后您不再拥有这些引用。(如果您不理解这一点,请不要使用这个函数。我警告过你。)

备注:此函数通常只被需要临时保存和恢复错误指示器的代码使用。使用PyErr_Fetch()来保存当前的错误指示器。

  • void PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
    这是稳定的ABI的一部分。在某些情况下,下面的PyErr_Fetch()返回的值可以是“非规范化”的值,这意味着exc是一个类对象,但val不是同一个类的实例。在这种情况下,此函数可用于实例化该类。如果这些值已经被规范化,则什么也不会发生。实现了延迟归一化来提高性能。

备注:此函数不会对异常值隐式地设置__回溯__属性。如果需要适当地设置回溯,则需要以下附加代码片段:

if (tb != NULL) {
PyException_SetTraceback(val, tb);
}
  • PyObject *PyErr_GetHandledException(void)
    自3.11版本以来的稳定ABI的一部分。检索活动的异常实例,这将由sys返回。例外这指的是一个已经被捕获的异常,而不是一个新提出的异常。返回对异常或NULL的新引用。不修改解释器的异常状态。

备注:希望处理异常的代码通常不使用此函数。相反,当代码需要临时保存和恢复异常状态时,可以使用它。使用PyErr_SetHandledException()来恢复或清除异常状态。

  • void PyErr_SetHandledException(PyObject *exc)
    自3.11版本以来的稳定ABI的一部分。设置活动异常,如从sys.异常()中得知。这个指的是已经捕获的异常,而不是新提出的异常。若要清除异常状态,请传递NULL。

备注:希望处理异常的代码通常不使用此函数。相反,当代码需要临时保存和恢复异常状态时,可以使用它。使用PyErr_GetHandledException()来获取异常状态。

  • void PyErr_GetExcInfo(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)
    自3.7版本以来的稳定ABI的一部分。检索从sys.exc_info()中所知的异常信息的旧式表示形式。这指的是已经捕获的异常,而不是新提出的异常。返回这三个对象的新引用,其中任何一个对象都可能为NULL。不修改异常信息状态。保留这个函数是为了实现向后兼容性。更喜欢使用PyErr_GetHandledException()。

备注:希望处理异常的代码通常不使用此函数。相反,当代码需要临时保存和恢复异常状态时,可以使用它。使用PyErr_SetExcInfo()来恢复或清除异常状态。

  • void PyErr_SetExcInfo(PyObject *type, PyObject *value, PyObject *traceback)
    自3.7版本以来的稳定ABI的一部分。设置异常信息,如从sys.exc_info()中得知的那样。这指的是一个已经被捕获的异常,而不是一个新提出的异常。这个函数窃取了参数的引用。要清除异常状态,请为所有三个参数传递NULL。保留这个函数是为了实现向后兼容性。更喜欢使用PyErr_SetHandledException()。

备注:希望处理异常的代码通常不使用此函数。相反,当代码需要临时保存和恢复异常状态时,可以使用它。使用PyErr_GetExcInfo()来读取异常状态。

在3.11版更改:类型和回溯参数不再使用,可以为NULL。解释器现在从异常实例(值参数)获得它们。该函数仍然窃取了所有这三个参数的引用。

信号处理

  • int PyErr_CheckSignals()
    这是稳定的ABI的一部分。这个函数与 Python 的信号处理交互。
    如果在主 Python 解释器下从主线程调用该函数,它将检查是否向进程发送了信号,如果是,则发起调用相应的信号处理句柄。如果支持 signal 模块,则可以发起调用以 Python 编写的信号处理句柄。
    该函数会尝试处理所有待处理信号,然后返回 0。但是,如果 Python 信号处理句柄引发了异常,则设置错误指示符并且函数将立即返回 -1 (这样其他待处理信号可能还没有被处理:它们将在下次发起调用PyErr_CheckSignals() 时被处理)。
    如果函数从非主线程调用,或在非主 Python 解释器下调用,则它不执行任何操作并返回 0。
    这个函数可以由希望被用户请求 (例如按 Ctrl-C) 中断的长时间运行的 C 代码调用。

备注: 针对 SIGINT 的默认 Python 信号处理句柄会引发 KeyboardInterrupt 异常。

  • void PyErr_SetInterrupt()
    这是稳定的ABI的一部分。模拟信号信号到达的效果。这相当于PyErr_SetInterruptEx(SIGINT)

备注:这个函数是异步信号安全的。它可以在没有Gil和从C信号处理程序的情况下调用。

  • int PyErr_SetInterruptEx(int signum)
    自3.10版本以来的稳定ABI的一部分。模拟信号到达时的效果。下一次调用PyErr_CheckSignals()时,将调用给定信号号的Python信号处理程序。这个函数可以被C代码调用,C代码设置自己的信号处理,并希望在请求中断时(例如当用户按Ctrl-C中断操作)时Python信号处理程序被预期调用。如果给定的信号不是由Python处理的(它被设置为信号。SIG_DFL或信号。SIG_IGN),它将被忽略。如果信号超出了允许的信号号范围,则返回-1。否则,返回0。此函数永远不会更改错误指示器。

备注:这个函数是异步信号安全的。它可以在没有Gil和从C信号处理程序的情况下调用

  • int PySignal_SetWakeupFd(int fd)
    此实用程序函数指定一个文件描述符,每当接收到信号时,信号号就被写入为单个字节。Fd必须是非阻塞的。它返回前面这样的文件描述符。值-1将禁用该功能,这是初始状态。这相当于Python中的signal.set_wakeup_fd(),但没有任何错误检查。fd应该是一个有效的文件描述符。该函数只能从主线程中调用。
    在 3.5 版更改: 在 Windows 上,此函数现在也支持套接字处理。

Exception 类

  • PyObject *PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
    返回值:新引用。这是稳定的ABI的一部分。此实用程序函数将创建并返回一个新的异常类。name参数必须是新异常的名称,它是表单模块的C字符串。类名。基本参数和dict参数通常为NULL。这将创建一个从异常派生出来的类对象(在C中可以作为PyExc_Exception访问)。
    新类的__模块__属性被设置为name参数的第一部分(直到最后一个点),并且类名称被设置为最后一部分(在最后一个点之后)。基参数可用于指定替代基类;它只可以是一个类,也可以是类的元组。dict参数可用于指定类变量和方法的字典。
  • PyObject *PyErr_NewExceptionWithDoc(const char *name, const char *doc, PyObject *base, PyObject *dict)
    返回值:新引用。这是稳定的ABI的一部分。和PyErr_NewException() 一样,除了可以轻松地 给新的异常类一个文档字符串:如果 doc 属性非空,它将用作异常类的文档字符串.

异常对象

  • PyObject *PyException_GetTraceback(PyObject *ex)
    返回值:新引用。这是稳定的ABI的一部分。将与异常相关的回溯作为新引用返回,可以通过__Python通过__回溯__访问。如果没有关联的回溯,这将返回NULL。
  • int PyException_SetTraceback(PyObject *ex, PyObject *tb)
    这是稳定的ABI的一部分。将异常关联的回溯设置为 tb 。使用 “Py_None“清除它。
  • PyObject *PyException_GetContext(PyObject *ex)
    返回值:新引用。这是稳定的ABI的一部分。返回与异常相关联的上下文(在此期间引发ex的另一个异常实例)作为新引用,通过__上下文__从Python访问。如果没有关联的上下文,则这将返回NULL。
  • void PyException_SetContext(PyObject *ex, PyObject *ctx)
    这是稳定的ABI的一部分。将与异常关联的上下文设置为ctx。使用NULL来清除它。没有进行类型检查来确保ctx是一个异常实例。这窃取了对ctx的引用。
  • PyObject *PyException_GetCause(PyObject *ex)
    返回值:新引用。这是稳定的ABI的一部分。返回与异常关联的原因(异常实例,或无,由提升…从…)作为新引用,通过Python通过__cause__访问。
  • void PyException_SetCause(PyObject *ex, PyObject *cause)
    这是稳定的ABI的一部分。将与异常关联的原因设置为原因。使用NULL来清除它。没有类型检查,以确保原因是异常实例或无。这窃取了对原因的引用。
    __suppress_context__被这个函数隐式地设置为True。

最后

以上就是重要花瓣为你收集整理的第五章 异常处理(中)查询错误指示器信号处理Exception 类异常对象的全部内容,希望文章能够帮你解决第五章 异常处理(中)查询错误指示器信号处理Exception 类异常对象所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部