2013-03-22 225 views
2

當在C++中使用異常時,我注意到一個奇怪的行爲,我希望這裏有人能解釋。看看下面的代碼:異常拋出異常

class Foo 
{ 
public: 

    Foo() 
    { 
     throw 0; 
    } 
}; 

class RandomException 
{ 
public: 

    Foo f; 
}; 

void bar() 
{ 
    throw RandomException(); 
} 

// Case #1 
int main() 
{ 
    bar(); 
    return 0; 
} 

在上面的情況下,我有一個未處理的異常。現在,如果我改變main功能的身體:

// Case #2 
int main() 
{ 
    try 
    { 
     bar(); 
    } 
    catch (int) 
    { 
    } 

    return 0; 
} 

我吞嚥異常。沒有未處理的異常,代碼運行良好。如果我的代碼更改爲:

// Case #3 
int main() 
{ 
    try 
    { 
     bar(); 
    } 
    catch (RandomException&) 
    { 
    } 

    return 0; 
} 

現在我再次有未處理的異常。

我想知道爲什麼在案件案例#2我沒有未處理的異常,並在案例#3我這樣做,即使在這兩種情況下,我拋出兩種例外,一個intRandomException類型之一。

C++如何在拋出異常時拋出異常時處理事件?

+1

你爲什麼會拋出一個自定義異常類的異常_inside_?這太瘋狂了。 RandomException的構造函數調用了Foo的構造函數,並且只在case 2中捕獲該異常,而不是case 3. – stefan 2013-03-22 13:16:54

+0

您最終在[The Daily WTF](http://thedailywtf.com/Articles/Crashception.aspx) 。 8v) – 2013-03-22 13:18:28

+0

@stefan科學當然。爲什麼呢? – Zeenobit 2013-03-22 13:19:19

回答

4

這裏,RandomException對象的構造失敗,出現異常,所以throw RandomException()從未完成和int(0)被拋出(在構建RandomException的處理)。

如果你有一個處理程序(如情況#2),控制權將被轉移到該處理程序。如果不是(如情況#3),將調用std::terminate()

+0

因此,由於'RandomException'的構造永遠不會「完成」,它永遠不會被拋出? – Zeenobit 2013-03-22 13:20:54

+0

@Zeenobit:的確,這就是發生的事情。 – 2013-03-22 13:29:10