![](/img/trans.png)
[英]How do I properly construct a query using the elasticsearch python 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中实现它? 我找到了一些文档 ,但是不确定我如何正确使用它。
这是我一直在尝试的方法:
打印:
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 >>>
PyErr_Occurred()
:
if(something) { PyErr_SetString(PyExc_TypeError, "Oh no!"); PyErr_Occurred(); }
行为:
>>> import awesomemod >>> awesomemod.thing() >>> TypeError: Oh no! >>>
所以有点晚了...
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.