2012-05-05 92 views
3

我有這個測試代碼來處理構造函數中的異常。 函數f()通過零創建一個異常除法​​,但這個異常不會被捕獲。 相反,如果我拋出一個自定義整數異常被捕獲。爲什麼無法在構造函數中捕獲異常?

#include <iostream> 
using namespace std; 

class A 
{ 
public: 
    void f(){ 
    int x; 
    x=1/0; 
    //throw 10; 
    } 

A(){ 
    try{ 
    f(); 
    } 
    catch(int e){ 
     cout << "Exception caught\n"; 
     } 
    } 
}; 

int main (int argc, const char * argv[]) 
{ 

    A a; 
    return 0; 
} 

爲什麼我能趕上定製 擲10; 而不是 x = 1/0;

回答

7

被零除的整數不是標準的C++異常。所以你不能依賴隱式拋出的異常。一個特定的編譯器可能會將除數映射爲某種異常(您將需要檢查編譯器文檔),如果是這樣,您可以捕獲該特定異常。但是請注意,這不是可移植的行爲,不適用於所有編譯器。

你可以做的最好的辦法是自己檢查錯誤條件(除數等於零)並明確拋出異常。

class A 
{ 
    public: 
     void f() 
     { 
      int x; 
      //For illustration only 
      int a = 0; 
      if(a == 0) 
        throw std::runtime_error("Divide by zero Exception"); 
      x=1/a; 
     } 

     A() 
     { 
       try 
       { 
        f(); 
       } 
       catch(const std::runtime_error& e) 
       { 
        cout << "Exception caught\n"; 
        cout << e.what(); 
       } 
     } 
}; 
+0

請注意,除以零除以整數除外,*會發生任何事情,包括崩潰,鼻惡魔和程序員懷孕。 – 2012-05-05 10:36:35

+0

好吧,我看到了...非常感謝你 – demosthenes