私はBoost.Pythonを使ってPython拡張モジュールを実装しています。モジュールは、Exception
を継承する独自のカスタム例外クラスを定義する必要があります。それ、どうやったら出来るの?Boost.Pythonカスタム例外クラス
答えて
次の関数は、新しいPython例外クラスを作成し、それを現在のスコープに追加します。モジュール初期化関数で呼び出された場合は、モジュールに追加されます。
最初の引数は、新しい例外クラスの名前です。 2番目の引数は、新しい例外クラスの基本クラスの型オブジェクトです。デフォルトではException
の型オブジェクトになります。戻り値は、新しい例外クラスの型オブジェクトです。
PyObject* createExceptionClass(const char* name, PyObject* baseTypeObj = PyExc_Exception)
{
using std::string;
namespace bp = boost::python;
string scopeName = bp::extract<string>(bp::scope().attr("__name__"));
string qualifiedName0 = scopeName + "." + name;
char* qualifiedName1 = const_cast<char*>(qualifiedName0.c_str());
PyObject* typeObj = PyErr_NewException(qualifiedName1, baseTypeObj, 0);
if(!typeObj) bp::throw_error_already_set();
bp::scope().attr(name) = bp::handle<>(bp::borrowed(typeObj));
return typeObj;
}
次のように関数を使用:
モジュールの初期化関数で関数を呼び出して、グローバル変数に戻り値を格納:
:タイプMyModule.MyException
の
PyObject* myExceptionTypeObj = 0;
BOOST_PYTHON_MODULE(MyModule)
{
...
myExceptionTypeObj = createExceptionClass("MyException");
...
}
上げる例外
PyErr_SetString(myExceptionTypeObj, "Oh my!")
'MyException'は実際にはC++型にマップされます。どうすればメンバーを公開できますか? – Barry
@ケニー:
あなたは
PyErr_SetString(myExceptionTypeObj, "Oh my!")
を参照している場合、私は、「グローバルオブジェクトに文字列をコピーする」としてこれを考えていないでしょう。むしろPythonの内部エラーインジケータを設定して、インタプリタが次のエラーインジケータチェック時にmyExceptionTypeObjのインスタンスを発生させるようにします。
Pythonの例外処理は、(Pythonスレッドごとの)グローバルエラーインジケータで動作します。これは、C APIのafaictを通して例外を発生させる通常の方法です。
私はこの時点でGILを持っていれば、あなたのCコードが入力されたPythonスレッドで例外を正しく発生させることができます。
- 1. Boost.Python:クラス外でクラスを考える
- 2. C#、メトロアプリケーション、カスタム例外クラス
- 3. カスタム例外クラスのC++構文
- 4. パイソン - カスタム例外
- 5. カスタムuinavigatonbar例外
- 6. カスタム例外ハンドラ
- 7. Javascriptカスタム例外
- 8. カスタムout_of_range例外
- 9. は、カスタム例外
- 10. Javaの例外処理 - カスタム例外
- 11. Boost.Python:クラス関数へのコールバック
- 12. 例外クラスなしでJavaでカスタム例外を作成しますか?
- 13. カスタム例外処理
- 14. プリプロッグフックのカスタム例外?
- 15. カスタム例外ハンドラC#
- 16. JAXBカスタム例外マーシャリングエラー
- 17. PHPカスタム例外メッセージ
- 18. Laravel 5.3.6カスタム例外
- 19. Cはカスタム例外
- 20. カスタム例外は、このカスタム例外を持つ
- 21. カスタム例外クラス - ランタイム例外または例外を拡張する必要がありますか?
- 22. Grailsプロジェクトにカスタム例外クラスを格納する場所は?
- 23. カスタム例外クラスが.classファイルにコンパイルされていません
- 24. ASP.NET MVC:カスタムIdentity UserStoreクラスでコントローラが例外をキャッチしない
- 25. codeigniterのカスタム例外クラスを作成する
- 26. laravel 5.3でカスタム例外クラスを定義する方法
- 27. Laravel 5.3でカスタム例外クラスとカスタムハンドラクラスを作成する
- 28. Javaクラスの例外例外のジェネリック
- 29. Sqlサーバーのカスタム例外
- 30. Python、カスタム例外の区別
エラーを「例外」から継承させます。 'StandardError'はpython標準ライブラリのツールで生成されるエラーによって使用されます。 – Daenyth
@Daenyth:そうです。私は質問を改訂しました。 – user763305