2013-11-21 47 views
2

讓:C++異常重新投擲和省略號

void foo(void) 
{ 
    throw std::exception(""); 
} 

void bar(void) 
{ 
    try 
    { 
     foo(): 
    } 
    catch(...) 
    { 
     throw; 
    } 
} 

void baz(void) 
{ 
    try 
    { 
     bar(); 
    } 
    catch(...) 
    { 
    } 
} 

是什麼巴茲()趕上?一個std ::異常或其他東西?

感謝您的幫助!

回答

3

它捕獲foo引發的std::exception。 (至少,如果有可能首先拋出std::exceptionthrow;沒有操作數會重新拋出當前正在處理的異常對象。

+0

感謝您的幫助。 – Virus721

1

是的,baz在這種情況下捕獲std::exception

但投擲std::exception時要小心,因爲它應該用作例外的基類。 C++標準(第18.8.1節)指定std::exception只有一個默認的構造函數和一個拷貝構造函數,所以你不能把消息放進去。

請考慮使用std::runtime_error代替。

+0

這只是爲了舉例。感謝您的回答。 – Virus721

+0

std :: exception'在符合標準的實現中是完全可移植的。作爲基類沒有限制。 –

+0

@PeteBecker,'std :: exception'是完全可移植的,但是由於它在大多數平臺上是抽象的(不包括MSVC),所以不能拋出它。 –