2009-03-04 29 views
11

聲明可能的異常從C++函數中拋出有什麼好處?換句話說,添加關鍵字throw()究竟做了什麼?限制C++函數允許的拋出有什麼好處?

我讀過函數聲明,如void do_something() throw();應該保證沒有例外來自do_something()函數;然而,這似乎並不適用於do_something()內所稱的功能,因此使其成爲弱保證。

請概述效用(和最佳使用案例)這種語言功能。

回答

0

基本上,通過與throw();聲明函數,你告訴編譯器,你是百每特定%的該功能是要拋出任何異常,讓編譯器進行一些優化。如果你的函數無論如何拋出一個異常,你就遇到了麻煩,因爲它最可能導致未定義的行爲。

+2

良好實際上:它調用了unexpected()。行爲不好,但是有明確的定義。 – MSalters 2009-03-04 12:02:27

5

C++標準規定,如果一個函數試圖拋出一個異常,是不是它的例外列表中unexpected()函數被調用。從MSDN這方面的一個簡短的描述是在這裏:http://msdn.microsoft.com/en-us/library/awbt5tew(VS.80).aspx

大多數編譯器實際上並不支持這個C++功能。

+1

>>大多數編譯器實際上並不支持這個C++功能<< - 對於一個例子,看你指着... – 2009-03-04 06:45:09

1
void do_something() throw(); 

這是從實施者方面保證函數永遠不會拋出異常。這是功能可以期望的客戶端。但是,這也意味着在函數內部的某處產生的任何異常都會被處理,並且不會重新返回到do_something()的父項。因爲沒有任何東西能夠阻止他投擲,所以他從內心感到羞愧。這是因爲,從具有空異常規範的函數中拋出等價於拋出規範中沒有提到的異常,並且使得std::unexpected()被預期並隨後終止程序。

BTW:強異常保證的普遍接受的定義是:如果由於某種原因,公開操作失敗,拋出一個異常,並且對象的狀態保持不變(原子操作)。

相關問題