2013-10-22 62 views
2

之间有什么区别:异常重新抛出

foo(); 

try{ 
    foo(); 
} catch (...){ 
    throw; 
} 

我的理解 - 如果在功能上没有的try-catch块调用foo() - 异常会被外部函数的try-catch块捕获(如果有的话)。我对吗?如果函数调用foo(),但没有捕捉者可以处理它的try-catch块 - 我必须写catch(...){throw;让它被外面的人抓住?有必要吗?

+0

只抓住你能处理的事情,或者如果你需要做地方清理。 –

+1

刚刚重新抛出的一切都基本上没有任何操作,并且没有任何用处。 –

+0

例外情况应该通常以最适合的级别进行处理。所以如果'foo()'对某些异常有异常处理,它只是它知道如何处理的异常。如果调用'foo()'的函数知道如何处理所有异常情况,那么'''一般都可以 - 意味着你知道你在做什么。或者,也可以在这里处理特定的异常,并让未知的异常传播...因此,总而言之,取决于抛出什么...... – Nim

回答

2

没有操作数的抛出表达式抛出异常处理为 。 [§15.1/ 8]

所以实际上也是一样的。

 

异常会被外界的功能try-catch块被捕获(如果 有的话)。我对吗?

是的。

 

但如果有什么功能一个try-catch块调用foo(), 但没有捕手谁可以处理它 - 我必须写赶上(...){抛出; 扔;让它被外面的人抓住?有必要吗?

处理您希望在呼叫点处理它们并将其他人处理的异常。你不必重新扔掉它们。如果没有捕手,最终会捕获异常std:terminate将被调用。

try 
{ 
    foo(); 
} 
catch (YourExpectedException &ex) 
{ 
    // ... 
} 
catch (...) \ 
{    \ 
       > // You don't need this kind of re-throwing 
    throw; /
}   /
+0

感谢您的回答! –