2014-05-02 138 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

感谢您的帮助。 –

相关问题