C++ 异常处理/重新引发异常的级别

C++ 异常处理/重新引发异常的级别,c++,exception,C++,Exception,我有一个函数,它基本上使用atsize_type pos从向量返回一个元素。如果out_of_range位置无效,at抛出std::out_of_range异常 我基本上希望将此异常传播到调用方,以便在该级别上处理它。我在getter中添加的重述是否有必要?或者我会通过完全省略try-catch得到同样的效果吗 int MyClass::GetNumber(size_t a_Idx) const { // Is the following try-catch-rethrow necess

我有一个函数,它基本上使用atsize_type pos从向量返回一个元素。如果out_of_range位置无效,at抛出std::out_of_range异常

我基本上希望将此异常传播到调用方,以便在该级别上处理它。我在getter中添加的重述是否有必要?或者我会通过完全省略try-catch得到同样的效果吗

int MyClass::GetNumber(size_t a_Idx) const
{
    // Is the following try-catch-rethrow necessary? Or can the whole try-catch be omitted?
    try
    {
        return m_Numbers.at(a_Idx);
    }
    catch (const std::out_of_range&)
    {
        // A throw expression that has no operand re-throws the exception currently being handled
        throw;
    }
}

MyClass m;

try
{
    int t = m.GetNumber(42);
}
catch(const std::out_of_range&){}
我尝试了这两种方法,但没有注意到任何区别,但我想知道我是否幸运,或者这是否是有保证的。

由std::vector::at引发的异常,就像任何其他异常一样,如果我错了,有人纠正我,它将展开堆栈,直到到达一个try-catch块,在那里它被捕获,或者,如果未在任何级别捕获,则会导致未处理的异常错误

因此,如果您的唯一目的是在调用方级别捕获它,而不进行任何中间异常处理,则无需就地捕获并重新调用它:只要没有中间的try-catch块处理它,它将到达调用方的try-catch块。

这是有保证的

异常会冒出气泡,直到有东西捕捉到它们……除非没有任何东西捕捉到它们,否则您的程序将中止

因此,您不需要显式地重新抛出每个范围

如果在继续让异常冒泡之前,您在catch块中有一些额外的工作要做,那么重新抛出将非常有用


不要忘记在您的文档中指出GetNumbersize会将std::抛出范围之外。

@Ben看一看由两个不同版本生成的程序集,在您的情况下,异常处理会使在没有异常的情况下使用的指令数加倍+1 jmp。是的,在MyClass::GetNumber中没有try块也会得到相同的效果。这就是例外点:如果不需要在本地处理它,就不需要为它编写任何代码。