2011-02-17 52 views
1

我有了這個代碼snnipet(整個程序編譯和鏈接正確):Python異常文本(boost庫)

... 
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

documentation of PyErr_Fetch:「的值和回溯對象可以是NULL即使當類型的對象不是」。在嘗試提取值之前,您應該檢查pvalue是否爲NULL。

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

如果你想檢查是否異常是一個SyntaxError你可以比較反對p型上市here的異常類型。

要回答更具體的,我會需要從它墜毀點回溯。

編輯

P值是個例外對象,而不是一個海峽的實例,所以你應該使用PyObject_Str得到異常的字符串表示。

您可能需要首先調用PyErr_NormalizeException將pvalue轉換爲正確的異常類型。

+0

嗯... pvalue不是NULL,ptraceback是NULL(由於它是語法錯誤,並且沒有堆棧幀,所以這很有意義) – jab 2011-02-17 09:18:14