2011-06-20 64 views
8

我正在用C編寫Python模塊。我需要報告無法用內置Python異常來描述的錯誤。因此,我想拋出我自己的例外。問題是,Python策略是從BaseException類派生所有異常。我知道如何創建派生類型對象(分配給tp_base memeber),但我不知道如何獲得對BaseException類型對象的引用。 PyExc_BaseException是對PyObject的引用,代表一個類,而不是一個類型對象。如何在C擴展中創建自定義Python異常類型?

如何從C代碼中拋出自定義Python異常?

+2

在Python中,一個(new-style)類和一個類型對象是相同的東西,所以我不明白你的問題。 –

+0

Sven,我已經鑄造了PyExc_RuntimeError並將其用作我自己的Exception的基類型。到目前爲止沒有發生任何不良事件(我相信長期運行後的段錯誤是由其他原因造成的)。你能回答我的問題嗎,所以我可以接受你的回答? – Basilevs

回答

4

在C代碼中創建新的異常類型的最簡單方法是致電PyErr_NewException

+1

如何將成員添加到結果類的對象?我想在excetion對象中存儲錯誤代碼somwhere。 – Basilevs

+0

@Basilevs:您可以將異常的構造函數參數傳遞給['PyErr_SetObject()'](http://docs.python.org/c-api/exceptions.html#PyErr_SetObject)。 'BaseException'的構造函數只是將參數元組存儲在'args'屬性中。如果您想要不同的行爲,請覆蓋構造函數。 –

+1

那麼python方面如何訪問這個值?我喜歡解析參數元組。我需要的是在凸起物體中的額外成員函數。如果PyErr_NewException的dict參數應該存儲額外的函數,我如何從Python端創建一個新的成員函數? – Basilevs

相關問題