2011-04-27 79 views
3

這不是關於從析構函數拋出異常是否安全的問題。C++從析構函數中拋出異常

http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.9狀態:

「在堆棧展開,所有的本地在所有這些堆棧幀中的對象是自毀如果這些析構函數之一拋出異常(假定它拋出一個Bar對象),C++運行時系統是在一個不成功的情況下:它是否應該忽視酒吧並最終進入}捕捉(Foo e){它最初是在哪裏引導的?它應該忽略Foo並尋找} catch(Bar e){handler?沒有好的答案 - 任何選擇都會丟失信息。「

IE:如果在堆棧展開期間拋出了另一個異常,那麼運行時系統處於非贏局面,因爲'查找'的捕獲處理器不明確。

當堆棧展開期間引發的異常本身位於try/catch塊中時,上述是否存在「異常」?在這種情況下,沒有歧義:

#include <iostream> 
using namespace std; 

class Component 
{ 
public: 
    ~Component() 
    { 
     cout << "In component destructor" << endl; 
     try 
     { 
      throw 1; 
     } 
     catch (...) 
     { 
      cout << "Caught exception in component destructor" << endl; 
     } 
    } 

}; 

class Container 
{ 
public: 
    ~Container() 
    { 
     cout << "In container destructor" << endl; 
     Component component; 
    } 
} 
    ; 

int main() 
{ 
    try 
    { 
     Container cont; 
     throw 'a'; 
    } 
    catch (...) 
    { 
     cout << "Caught main exception ok" << endl; 
    } 
return 0; 
} 

下意味着它,但我想知道是否有人知道相關的C++標準部分。

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr155.htm

「如果堆在心情放鬆的析構函數拋出異常,並且異常沒有被處理,將終止()函數被調用下面的例子說明了這一點:」

回答

7

您的組件的析構函數是安全的。如果異常被拋出析構函數的你只是引用該規則適用

編輯(即析構函數的調用者):下面是來自standard(強調)一個相關報價

注意:如果在 堆棧展開期間被調用的析構函數以 異常退出,則std :: terminate被稱爲 (15.5.1)。