2010-07-23 53 views
4

例如,在下面的代碼:當從另一個異常處理堆棧時引發異常時會發生什麼?

#include <iostream> 
using namespace std; 
class A { 
    public: 
      A() { cout << "A::A()" << endl; } 
      ~A() { cout << "A::~A()" << endl; throw "A::exception"; } 
    }; 
class B { 
    public: 
      B() { cout << "B::B()" << endl; throw "B::exception"; } 
      ~B() { cout << "B::~B()"; } 
    }; 
int main(int, char**) 
{ 
    try { 
      cout << "Entering try...catch block" << endl; 
      A objectA; 
      B objectB; 
      cout << "Exiting try...catch block" << endl; 
    } 
    catch (char* ex) { 
      cout << ex << endl; 
    } 
    return 0; 
} 

B的析構函數拋出異常,這將調用A的析構函數而展開堆棧,從而導致另一個異常的拋出。 該計劃的反應是什麼?

+0

重複:http://stackoverflow.com/questions/130117/throwing-exceptions-out-of-一,析構函數 – 2010-07-23 14:13:34

回答

6

簡答題? Bang,應用程序終止。

parashift

在棧展開,所有在所有這些堆棧幀的局部對象會被銷燬。如果那些析構函數之一拋出一個異常(假定它拋出一個Bar對象),C++運行時系統處於一個兩難的境遇:應該忽略的酒吧,並在

} catch (Foo e) { 

它最初落得何去何從?它應該忽略Foo並尋找一個

} catch (Bar e) { 

處理程序?沒有好的答案 - 任何選擇都會丟失信息。

所以C++語言保證它會在這個時候調用terminate(),並且terminate()殺死這個進程。棒你死了。

堆棧溢出相關的問題: