2011-06-20 14 views
8

私はCでPythonモジュールを書いています。組み込みのPython例外では記述できないエラーを報告する必要があります。私は自分のタイプの例外をスローしたいと思っています。問題は、PythonポリシーがBaseExceptionクラスからすべての例外を派生させることです。私は派生型オブジェクト(tp_baseメンバに割り当てる)を作成する方法を知っていますが、BaseException型オブジェクトへの参照を取得する方法はわかりません。 PyExc_BaseExceptionはPyObjectへの参照であり、型オブジェクトではなくクラスを表します。CエクステンションでカスタムPython例外タイプを作成するには?

CコードからカスタムPython例外をスローするにはどうすればよいですか?

+2

(new-style)クラスと型オブジェクトはPythonでは同じものなので、私はあなたの問題を理解していません。 –

+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側はどのようにこの値にアクセスできますか?私はargsタプルを解析するのが好きです。私が必要とするのは、隆起したオブジェクトの余分なメンバ関数です。 PyErr_NewExceptionのdict引数が余分な関数を格納することになっている場合、Python側から新しいメンバー関数を作成するにはどうすればよいですか? – Basilevs

関連する問題