2014-05-02 27 views
3

任何人都可以跟我確認:再次拋出catch塊中的異常

在C++中,內catch塊,我們可以用throw語句重新拋出一個異常,而是拋出異常應與當前捕獲的類型相同。

+1

我當然希望不會;或者我的異常處理代碼的很大一部分是錯誤的! ;) – dlf

回答

2

重新排除的異常可以有不同的類型。 這將編譯並正確運行在VS2012

// exceptions 
#include <iostream> 
using namespace std; 

int main() { 
try{ 
     try 
     { 
     throw 20; 
     } 
     catch (int e) 
     { 
     cout << "An exception occurred. Exception Nr. " << e << '\n'; 
     throw string("abc"); 
     } 
    } 
    catch (string ex) 
    { 
     cout<<"Rethrow different type (string): "<< ex<<endl; 
    } 
    return 0; 
} 

輸出:

發生異常。例外編號20

重新拋出不同類型(字符串):ABC

+0

這個例子證實了我的信息是錯誤的,我在eclipse cdt上運行它,並且它成功了。謝謝。 –

+2

但是,'throw;'總是會重新拋出現有的異常,導致一些巧妙的技巧。 –

+1

等等,爲什麼'20'不在你的樣本輸出中? –

4

不一定。只要你抓住它,它取決於你如何處理它。您可以拋出一個相同的異常或一個全新的異常。或者,什麼都不做。

6

throw;全部由自己在catch塊重新拋出剛捕捉到的異常。

catch(...) 
{ 
    cleanup(); 
    throw; 
} 

但你也完全:如果您需要(例如)在響應異常進行一些清理操作,但仍然允許它upstack傳播到那裏可以更充分地處理的地方,這是有用自由地做到這一點:

catch(SomeException e) 
{ 
    cleanup(); 
    throw SomeOtherException(); 
} 

,事實上它常常方便任何類型的您記錄了你扔來完成這一功能,以翻譯由你叫成成代碼拋出的異常。

+0

感謝您的幫助。 –

相關問題