2012-07-20 117 views
12
class A{ 
    public: 
     A() { throw string("exception A"); }; 
}; 

class B{ 
    A a; 
    public: 
     B() try : a() {} catch(string& s) { cout << &s << " " << s << endl; }; 
}; 

int main(){  
    try{ 
     B b; 
    }catch(string& s){ 
     cout << &s << " " << s << endl; 
    } 
    return 0; 
} 

輸出是:異常被捕獲兩次

0x32c88 exception A 
0x32c88 exception A 

由於異常已經陷入了B構造,爲何仍然出現在主函數?

回答

21

當contol流到達構造函數的function-try-block的處理程序結束時,捕獲的異常將自動重新拋出。

在派生類構造函數中構造基類或成員期間,您無法抑制拋出的異常,因爲這會導致構造派生對象的基礎或成員未能構建。

這GOTW是相關的:http://www.gotw.ca/gotw/066.htm

從ISO/IEC 14882:2011 15.3 [except.handle]/15:

如果控制到達處理程序結束當前處理的異常被重新拋出構造函數或析構函數的函數嘗試塊。 [...]