2013-06-06 52 views
3

我有關於使用C++例外3名是/否問題:規則在C++異常的語法和

  1. 是否異常類必須從標準庫中定義的異常類派生?

  2. 如果在函數中引發異常,例如f(),但在那裏沒有處理,則將異常傳播到名爲f()的函數。這是真的嗎?

  3. 異常對象可以是用戶定義的類型或內置於C++的任何類型。這是真的?

+8

(1)不,它*應該*按照慣例和常識派生,但語言並不要求它。 (2)是的。這是例外的基本思想。 (3)是的。請參閱1. – Elazar

+1

異常對象可以是任何可複製類型的實例。 –

+0

如果答案是肯定的,爲什麼下面的代碼給我錯誤? 的#include 空隙f()的 { 嘗試 \t \t { \t \t \t擲20; \t \t} } INT主() { \t F(); catch(int e) { cout <<「發生異常,異常編號」<< e << endl; } return 0; } –

回答

4

(1)是否一個異常類必須從在標準庫中定義的異常類派生?

實際上任何東西都可以作爲例外拋出,包括基本類型(例如int)或C字符串。如果拋出的異常是class類型,則只有15.1/5中定義的條件C++ 11:

當拋出的對象是類對象時,複製/移動構造函數和析構函數即使複製/移動操作被取消(12.8),也可以訪問。

 

(2)如果異常的功能,比方說,f()拋出,但沒有處理好那裏,異常傳播到調用f()功能。這是真的嗎?

如果從try...catch子句中拋出,並有確定的catch聲明的異常類型(或者它的類層次結構的祖先)相匹配,異常會被捕獲。否則(或者如果從catch語句中捕獲並重新生成),它將確實傳播給調用函數,並以遞歸方式以相同方式處理。

(3)異常對象可以是用戶定義的類型或內置於C++的任何類型。這是真的?

是的,除上述(1)之外;如果是類類型的,複製和移動構造函數和析構函數都必須是可訪問的。 (它們不一定是用戶定義的,但它們必須是可訪問的,即不是私有的。)

+0

謝謝親愛的jogojapan –