2015-04-06 61 views
1

我想處理默認值構造類成員中的異常。類似這樣的:C++ c-tor處理默認成員值構造異常?

int func() 
{ 
    throw 9.0; 

    return 9; 
} 

struct T 
{ 
    T() try { 
    } 
    catch(...) 
    { 
     cout << __func__ << endl; 
    } 
    int a{func()}; 
} ; 

這可能嗎?最新的ISO C++標準對此有何評論?

編輯:我實際上證實了自己它在大多數編譯器上工作,但它是否定義良好,我應該通常使用這種構造?

+0

我很確定,如果你發現異常,就會被重新拋出。 – chris 2015-04-06 12:01:53

+0

爲什麼這樣?你可以解釋嗎? – AnArrayOfFunctions 2015-04-06 12:02:20

+0

啊,*如果控件到達構造函數或析構函數的函數 - 嘗試塊 的處理函數的末尾,則重新拋出當前處理的異常* – chris 2015-04-06 12:03:41

回答

2

這可能嗎?

是的,該異常將由功能級處理程序處理,就像成員初始化程序拋出的任何其他異常一樣。請注意,在構造函數的function-try-block中,在處理它之後重新拋出異常。如果初始化子對象失敗,這是你想要的,因爲完整的對象是無效的。

最新的ISO C++標準對此有何評論?

我沒有C++ 14還,但C++ 11說:

15/4:複合語句的執行,或者對構造過程中拋出的異常和析構函數, 初始化或破壞過程中,分別類的子對象的,將控制轉移到一個處理程序 在函數試塊以相同的方式作爲試戴的執行過程中引發的異常塊傳輸 控制給其他處理程序。

和15.3/15指定它在這種情況下重新排列。

我通常應該使用這個構造嗎?

可能不是 - 你可以做些什麼來處理子對象初始化失敗的問題,所以在捕獲和重新拋出異常時通常沒有意義。您可能想要在異常通過時報告錯誤。

0

那是不可能的,你只能抓住你的構造函數體內做的事例外,像這樣:

struct T 
{ 
    T() { 
    try { a = func();} 
    catch(...) 
    { 
     cout << __func__ << endl; 
    } 
    } 
} 

你也應該捕捉到了異常,但不是在構造函數,但在對象被構造。那就是:

try { 
    T t;//construct 
} 
catch(...) 
{}; 

這樣你就失敗了。

+1

問題中的語法非常有效,如果這就是你的意思。 – chris 2015-04-06 12:05:43