第五章 异常处理(下)

Unicode 异常对象

以下函数用于创建和修改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)
    返回值:新引用。这是稳定的ABI的一部分。创建一个具有属性编码、对象、长度、开始、结束和原因的单单码解码错误对象。编码和原因是UTF-8编码的字符串。
  • PyObject *PyUnicodeDecodeError_GetEncoding(PyObject *exc)
  • PyObject *PyUnicodeEncodeError_GetEncoding(PyObject *exc)
    返回值:新引用。这是稳定的ABI的一部分。返回给定异常对象的编码属性
  • PyObject *PyUnicodeDecodeError_GetObject(PyObject *exc)
  • PyObject *PyUnicodeEncodeError_GetObject(PyObject *exc)
  • PyObject *PyUnicodeTranslateError_GetObject(PyObject *exc)
    返回值:新引用。这是稳定的ABI的一部分。返回给定异常对象的对象属性
  • 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)
    这是稳定的ABI的一部分。获取给定异常对象的start属性,并将其放入
    start中。启动值不能为空。成功时返回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)
    这是稳定的ABI的一部分。将给定的异常对象的启动属性设置为要启动。成功时返回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)
    这是稳定的ABI的一部分。获取给定的异常对象的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)
    这是稳定的ABI的一部分。将给定的异常对象的end属性设置为end。成功时返回0,失败时返回1。
  • PyObject *PyUnicodeDecodeError_GetReason(PyObject *exc)
  • PyObject *PyUnicodeEncodeError_GetReason(PyObject *exc)
  • PyObject *PyUnicodeTranslateError_GetReason(PyObject *exc)
    返回值:新引用。这是稳定的ABI的一部分。返回给定异常对象的原因属性
  • int PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
  • int PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
  • int PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
    这是稳定的ABI的一部分。将给定的异常对象的原因属性设置为原因。成功时返回0,失败时返回1。

递归控制

这两个函数提供了一种在核心模块和扩展模块上执行安全递归调用的方法。如果递归代码不一定调用Python代码(它会自动跟踪其递归深度),则需要这些代码。tp_call实现也不需要它们,因为调用协议负责递归处理。

  • int Py_EnterRecursiveCall(const char *where)
    自3.9版本以来的稳定ABI的一部分。标记一个即将执行递归c级调用的点。如果定义了 USE_STACKCHECK,此函数会使用PyOS_CheckStack() 来检查操作系统堆栈是否溢出。在这种情况下,它将设置一个 MemoryError 并返回非零值。
    然后,该函数将检查是否达到了递归极限。如果是这种情况,则设置一个递归错误,并返回一个非零值。
    否则,将返回零。其中应该是一个UTF-8编码的字符串,如“实例检查”,将连接到由递归深度限制引起的递归错误消息。
    在3.9版更改:这个函数现在也可以在有限的API中使用。
  • void Py_LeaveRecursiveCall(void)
    自3.9版本以来的稳定ABI的一部分。结束一个Py_EnterRecursiveCall()。每次成功调用Py_EnterRecursiveCall()时,都必须调用一次。在3.9版更改:这个函数现在也可以在有限的API中使用。

正确地实现容器类型的tp_repr需要特殊的递归处理。除了保护堆栈之外,tp_repr还需要跟踪对象,以防止循环。以下两个功能促进了此功能。实际上,这些都是C,相当于reprlib.recursive_repr()。

  • int Py_ReprEnter(PyObject *object)
    这是稳定的ABI的一部分。在tp_repr实现开始时调用来检测周期。如果该对象已经被处理过,则该函数将返回一个正整数。在这种情况下,tp_repr实现应该返回一个指示一个循环的字符串对象。例如,dict对象返回{…},而list对象返回[…]。如果达到了递归极限,则该函数将返回一个负整数。在这种情况下,tp_repr实现通常应该返回NULL。否则,函数返回零,tp_repr实现可以正常继续。
  • void Py_ReprLeave(PyObject *object)
    这是稳定的ABI的一部分。结束一个Py_ReprEnter()。对于每次调用一个返回零的Py_ReprEnter(),都必须调用一次。

标准异常

所有的 Python 标准异常都可用作全局变量,其名称为 PyExc_ 跟上 Python 异常名称。这些变量是 PyObject*类型;都是类对象。下面列出了全部这些用作标准异常的变量:
在这里插入图片描述
在这里插入图片描述

标准警告类别

所有的标准 Python 警告类别都可以用作全局变量,其名称为 “PyExc_“ 跟上 Python 异常名称。这些变量是PyObject* 类型;都是类对象。以下列出了所有用作警告的变量:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中亿丰数字科技集团有限公司

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值