2011-01-26 12 views
6

私はライブラリを使用しています。ライブラリの特定のクラスから継承したクラスを定義するAPIドキュメントを指定しています。ライブラリ自体はC++で書かれており、PythonへのバインディングはSWIGを使って生成されます。問題は、私がPythonのコードを実行したときに、Pythonがどんな例外をスローしても、「Swig :: DirectorMethodException 'のインスタンスを投げた後に終了するというエラーが出ます。SWIG:C++コードからのPython例外の報告

プログラムの実行中に報告されるPythonコードによってこの例外が発生したがっています。私がZeroDivisionErrorを取得した場合のEsp。

SWIGのドキュメントhttp://www.swig.org/Doc2.0/Python.html#Python_nn36に記載されている方法にちょっとハックしようとしましたが、運はありません。私はまだ同じメッセージを取得します。「swig :: DirectorMethodException」のインスタンスをスローした後に呼び出されるterminateは、module.iファイルに何を入れても関係ありません。

この問題を回避する方法について、私に何か指摘してもらえますか?そうすれば、Pythonの例外はそのまま報告されますか?

答えて

1

は、私はあなたのコードベースにしているに沿ってどこまで知っていないので、これはほとんど使用さかもしれませんが、私はSWIGよりブースト::のpythonとのより良い運を持っていました。次に、これを行うことができます:boost::python Export Custom Exception

+1

ありがとうございました。私は実際にこの問題を修正し、修正はここにあります:https://github.com/madhusudancs/mesos/commit/93ed9f32d8752d687d6b6af6bcb6bfdf815f115dこれは非常に単純ですが、間違いなくよく文書化されていません。また、これは私のプロジェクトではないので、開発者にboost :: pythonを使用するよう提案することはできますが、それは実現できません。 –

+0

SWIGが必須であると考えました。私は、私のようにこの質問に遭遇した人々にブーストオプションを残したかったのです:)。そして今、彼らはSWIGも持っています。 – ginbot

2

プログラムのコンソールでPythonによって発生した例外を報告します。

これはMadhusudan.C.Sの有用な修正です。 ginbotの答えに対する彼のコメントを見てください。 私はそれをもっと目に見えるように答えています。

/* MyInterface.i */ 
%module(directors="1") MyInterface 
%feature("director:except") { 
    if($error != NULL) { 
     PyObject *ptype, *pvalue, *ptraceback; 
     PyErr_Fetch(&ptype, &pvalue, &ptraceback); 
     PyErr_Restore(ptype, pvalue, ptraceback); 
     PyErr_Print(); 
     Py_Exit(1); 
    } 
} 
関連する問題