如果我使用“throw”会发生什么?无异常抛出?

时间:2010-02-18 12:55:07

标签: c++ exception refactoring

这是设置。

我有一个C ++程序,它调用了几个函数,所有这些函数都可能抛出相同的异常集,并且我希望每个函数中的异常具有相同的行为 (例如,打印错误消息&将所有数据重置为exceptionA的默认值;只需打印异常B;干净地关闭所有其他异常)。

似乎我应该能够设置catch行为来调用私有函数,它只是重新抛出错误,并执行捕获,如下所示:

void aFunction()
{
    try{ /* do some stuff that might throw */ }
    catch(...){handle();}
}

void bFunction()
{
    try{ /* do some stuff that might throw */ }
    catch(...){handle();}
}

void handle()
{
    try{throw;}
    catch(anException)
    {
        // common code for both aFunction and bFunction
        // involving the exception they threw
    }
    catch(anotherException)
    {
        // common code for both aFunction and bFunction
        // involving the exception they threw
    }
    catch(...)
    {
        // common code for both aFunction and bFunction
        // involving the exception they threw
    }
}

现在,如果在异常类之外调用“handle”会发生什么。 我知道这应该永远不会发生,但我想知道C ++标准是否未定义该行为。

3 个答案:

答案 0 :(得分:16)

如果在异常的上下文之外调用handle(),则throw将处理没有异常。在这种情况下,标准(参见第15.5.1节)指定

  

如果当前没有处理异常,执行throw-expression没有操作数调用terminate()

所以你的申请将会终止。那可能不是你想要的。

答案 1 :(得分:5)

如果在catch块中使用throw,它将重新抛出异常。如果在catch块之外使用throw,它将终止应用程序。

答案 2 :(得分:1)

从不,永远不要使用catch(...),因为您可能会捕获您不想捕获的应用程序错误,例如错误,访问冲突(取决于你如何编译)。

阅读伟大的John Robbins一书(调试Windows应用程序),其中详细解释了为什么不应该这样做。