![](/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.