1

このコード スニペットを取得しました (プログラム全体が正しくコンパイルおよびリンクされます)。

...
try
{
    boost::python::exec_file(
        "myscript.py",            // this file contains a syntax error
        my_main_namespace, 
        my_local_namespace
    );
    return true;
}
catch(const boost::python::error_already_set &)
{
PyObject *ptype, *pvalue, *ptraceback;
PyErr_Fetch(&ptype, &pvalue, &ptraceback);

    // the next line crashes on syntax error
    std::string error = boost::python::extract<std::string>(pvalue);
    ...
}

プログラムが実行しようとするファイルに構文エラーがあるため、例外がスローされます。プログラムがエラー メッセージを取得しようとすると、クラッシュします...

このコードは実行時エラーには問題なく機能しますが、何らかの理由で構文エラーでクラッシュします。

この種のエラーでエラー文字列を取得するにはどうすればよいですか?

前もって感謝します

4

1 に答える 1

4

PyErr_Fetchのドキュメントから:「型オブジェクトがそうでない場合でも、値とトレースバック オブジェクトは NULL である可能性があります」。値を抽出する前に、pvalue が NULL かどうかを確認する必要があります。

std::string error;
if(pvalue != NULL) {
    error = boost::python::extract<std::string>(pvalue);
}

例外が SyntaxError かどうかを確認したい場合は、ptype をここにリストされている例外タイプと比較できます。

これ以上具体的に答えるには、クラッシュした時点からのバックトレースが必要です。

編集

pvalue は str インスタンスではなく例外オブジェクトであるため、例外の文字列表現を取得するにはPyObject_Strを使用する必要があります。

pvalue を正しい例外タイプに変換するために、最初にPyErr_NormalizeExceptionを呼び出す必要がある場合があります。

于 2011-02-17T09:02:31.700 に答える