2010-04-26 136 views
9

我在linux上使用gcc編譯C++代碼。 有一些不應該被處理的例外,應該關閉程序。 然而,我想能夠顯示異常字符串:C++運行時,顯示異常消息

例如:

throw std::runtime_error(" message");不顯示消息,只有類型的錯誤。 我想顯示消息。 有辦法做到這一點嗎?

這是一個圖書館,我真的不想把catch語句,讓圖書館用戶決定。 但是,現在庫用戶是fortran,它不允許處理異常。 原則上,我可以把處理器在包裝代碼,而不是是否有辦法解決

+0

'throw std :: runtime_error(「message」);'現在顯示消息在g ++ 6.2.0,Ubuntu 16.10上。 – 2017-02-19 22:40:12

回答

12

標準的異常都有一個虛擬what()方法,讓你與異常關聯的消息:

int main() { 
    try { 
     // your stuff 
    } 
    catch(const std::exception & ex) { 
     cerr << ex.what() << endl; 
    } 
} 
+0

我對我的要求進行了澄清 – Anycorn 2010-04-26 17:19:29

+3

@aaa如果您的代碼旨在用於非C++代碼,則應該提供C連接,並且絕不應允許異常轉入調用代碼。 – 2010-04-26 17:27:12

+0

將終端問題傳達到主程序中的一種好方法是什麼? 我需要一些工具來打印錯誤字符串,而不依賴Fortran輸出 – Anycorn 2010-04-26 17:46:29

6

你可以在主寫:

try{ 

}catch(const std::exception &e){ 
    std::cerr << e.what() << std::endl; 
    throw; 
} 
+0

我提出了一些澄清。 原則上,如果沒有辦法解決這個問題,我可以使用類似的方法 – Anycorn 2010-04-26 17:19:12

+0

並注意,這有一個缺點,就是吹掉g ++通常會保留在覈心文件中的未捕獲異常的callstack。 – 2010-04-26 17:57:01

2

你可以使用try/catchthrow;聲明,讓用戶庫處理異常。 throw;語句將控制傳遞給另一個處理程序以執行相同的異常。

+0

好吧,我想我會嘗試用fortran/c包裝中的消息打印並拋出。那麼我會讓C++接口自己處理異常 – Anycorn 2010-04-26 17:26:48

1

我建議爲fortran調用者的庫製作一個適配器。把你的try/catch放入適配器。從本質上講,如果您希望從Fortran(或C)調用它,但仍允許異常提供給C++調用方,那麼您的庫需要多個入口點。這種方式還具有將C++鏈接提供給C++調用者的優點。只有擁有一個fortran接口才會限制你的工作,因爲一切都必須通過引用傳遞,你需要考慮char *參數的隱藏參數等。