2013-06-21 44 views
3

这可能是一个微不足道的问题 - 但它对我来说并不明显,所以我需要一些确认。假设我有一个try-catch块的功能:C++ try-catch异常处理约定

int function some_crap() { 
    some_type b; 
    int a = 10; 
    try { 
     a = boost::numeric_cast<int>(b); 
    } 
    catch(boost::bad_numeric_cast& e) { 
     std::cout << e.what() << std::endl; 
     return a; 
    } 
    catch(...) { 
     //-Handle other unknown exceptions 
     return a; 
    } 
    return a; 
} 

IIRC,我需要把return a语句在每个catch块的,对不对?同样在catch的每个块中,a的值将分别为10,对不对?

感谢您的时间&兴趣。 --T

+0

你可以把一个'返回;在你的函数 –

+0

感谢@Basie的尽头'声明。所以你说这个计划将会在catch块之外回归?这是我不确定的部分。 –

+0

处理未知的例外是不可能的。你可以忽略它们,但那不是真正的“处理”。 – Casey

回答

4

IIRC,我需要把return a语句在每个catch块的,对不对?

不,不是在这种情况下。重要的是,如果不返回任何东西(6.6.3/2,这将是未定义的行为),你不会返回值返回函数的末尾。

既然你有一个return语句:

return a; 

在你的函数结束时,不要求您catch块包含一个。

另外,如果你没有任何价值在出错的情况下返回,你可以通过做重新抛出当前处理的例外:

throw; 

或避免到捕获和重新抛出异常的所有并通过忽略相应的catch块来让它传播,以防您没有足够的如何恢复知识和/或您不需要记录任何消息。

让异常沿着调用堆栈可以比只是返回一个硬编码值,如10

至于第二个问题更有意义:

同样在每个掣子的块,一个将有10的价值,对吧?

是的,这是保证。

2

由于您在函数结束时有return a,因此您可以在内省略return a catch。但是,它的返回捕获也可以。