繁体   English   中英

如何正确使用Python的C API和异常?

[英]How do I properly use Python's C API and exceptions?

如果我做类似的事情

 >>> x = int(1,2,3,4,5)

我立即收到一个致命错误(如果它是在预编写的脚本中,则它将终止程序执行)

 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
 TypeError: int() takes at most 2 arguments (5 given)

并且x保持未定义状态:

 >>> x
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
 NameError: name 'x' is not defined

我将如何在Python的C API中实现它? 我找到了一些文档 ,但是不确定我如何正确使用它。

这是我一直在尝试的方法:

  1. 打印:

     if(something) { PyErr_SetString(PyExc_TypeError, "Oh no!"); PyErr_Print(); } 

    不幸的是,这仅打印异常,程序继续运行。 此外,如果我理解正确的话, PyErr_Print()会从某种队列中删除该异常,因此Python认为该异常已得到处理。 看起来是这样的:

     >>> import awesomemod >>> x = awesomemod.thing() TypeError: Oh no! >>> x # x is defined because the function returns None eventually >>> 
  2. PyErr_Occurred()

     if(something) { PyErr_SetString(PyExc_TypeError, "Oh no!"); PyErr_Occurred(); } 

    行为:

     >>> import awesomemod >>> awesomemod.thing() >>> TypeError: Oh no! >>> 

    所以有点晚了...

  3. return PyErr_Occurred()

     if(something) { PyErr_SetString(PyExc_TypeError, "Oh no!"); return PyErr_Occurred(); } 

    行为:

     >>> import awesomemod >>> awesomemod.thing() <type 'exceptions.TypeError'> >>> TypeError: Oh no! 

    这真的很奇怪。

我需要怎么做才能获得内置函数的行为?

编辑:我尝试了@ user2864740在评论中建议的内容,并且效果很好!

 if(something) {
     PyErr_SetString(PyExc_TypeError, "Oh no!");
     return (PyObject *) NULL;
 }

在C中引发异常是通过设置异常对象或字符串,然后从函数返回NULL来完成的。

正如伊格纳西奥·巴斯克斯(Ignacio Vazquez-Abrams)所说

在C中引发异常是通过设置异常对象或字符串,然后从函数返回NULL来完成的。

有一些便利功能,使这些操作对于常见的异常类型很容易实现。 例如,可以这样使用PyErr_NoMemory

PyObject *my_function(void)
{
    return PyErr_NoMemory();  // Sets the exception and returns NULL
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM