簡體   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