2011-06-29 78 views
3

請看看演示代碼:一些問題有關異常處理

class myError 
{ 
    const char* str; 
public: 
    myError():str(NULL) {} 
    myError(const char* temp) 
    { 
     str = temp; 
    } 
    const char* what() 
    { 
     return str; 
    } 
}; 

class ab 
{ 
    int x; 
public: 
    ab() try :x(0) 
    { 

      throw myError("error occured in the constructor of class ab"); 
    } 
    catch(myError& temp) 
    { 
     std::cout<<"Handler no. 1 of ab constructor"<<std::endl; 
    } 
}; 

int main() try 
{ 
    ab bb; 
    cout << "Resumed execution!" << endl; 
    return 0; 
} 
catch(myError& temp) 
{ 
    std::cout<<"Handler below the main function"<<std::endl; 
    std::cout<<"And the error is :" <<temp.what(); 
} 

我的問題:構造函數的

  1. 爲什麼只有功能try塊的處理器和析構函數只rethows例外呢? ,

,當你簡單地拋出內部構造函數的異常,其處理程序不會重新拋出的對象?即

Ctor::Ctor() 
{ 
    try{ 
     throw Excep1(); 
    } 
    catch(Excep1& temp) { 
     std::cout<<"Doesn't rethrows the exception object"; 
    } 
} 
  1. 我想知道如何恢復控制權交還給cout << "Resumed execution!" << endl;,處理重新拋出對象後?

  2. 爲什麼經常說,我們不應該把功能try塊在析構函數的基類的?

+0

的析構函數,你的意思析構函數? – MGZero

+0

@ MGZero:是) –

+0

我看不出在你的代碼中重新拋出。你只是捕捉例外。 – VestniK

回答

7

通常的規則是:catch塊不重新拋出,除非你要求它 來。你將如何阻止異常傳播,否則。在 構造的情況下,然而,如果事情在初始化 列表拋出,那麼你還沒有得到完全構造的對象;有 什麼,你可以與對象做,甚至沒有調用析構函數上 它。如果構造函數的功能catch塊不 重新拋出,什麼是它要做的事情,因爲它不能簡單地返回(和 離開堆棧上的變量)?

在所有其他情況下,包含catch塊 的函數知道該怎麼做。在的情況下,你的主,比如,你可以寫 : 嘗試{ AB BB; }趕上(...){} 性病 ::法院< < 「恢復執行!」 < < std :: endl;

你不能做的是執行代碼,其中bb將在範圍內, 可訪問,但沒有正確構建。至於爲什麼你不應該在基類的析構函數上放置函數try塊,我從來沒有聽說過這個規則。一般來說,破壞者 不應該拋出,所以沒有必要將它們封裝在一個try塊中, 期間。

+0

引用您的最後一個段落:請問爲什麼基類的dtor不會拋出異常? ,謝謝 –

+0

@MrAnubis:析構函數不應該拋出,因爲當發生異常並且堆棧被解開時它們被調用。所以,如果你有一個異常,然後調用一個dtor拋出一個異常,你只會拋出一個異常,*而另一個被拋出。不好的事情發生了('terminate()'被調用,我認爲)。 –

+0

謝謝你這麼好的解釋。 –

1

對於第二個問題,析構函數不應該是拋出期。考慮一下你的析構函數通過delete釋放大量內存的情況。如果你的析構函數在完成清理之前拋出一個錯誤會發生什麼?你現在有一個內存泄漏。如果你的析構函數導致運行時錯誤,那麼你的代碼中的其他地方可能有問題需要修復。

0

由於通常,香草薩特知道並說明了一切:

如果處理器主體包含語句「扔」;那麼catch塊顯然會重新拋出A :: A()或B :: B()發出的異常。不太明顯的,但在標準中明確指出的是,如果catch塊不拋出(重新拋出原始異常或拋出新東西),並且控制達到構造函數或析構函數的catch塊的末尾,那麼原始異常會自動重新生成。

More in his article