这是设置。
我有一个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 ++标准是否未定义该行为。
答案 0 :(得分:16)
如果在异常的上下文之外调用handle()
,则throw
将处理没有异常。在这种情况下,标准(参见第15.5.1节)指定
如果当前没有处理异常,执行
throw-expression
没有操作数调用terminate()
。
所以你的申请将会终止。那可能不是你想要的。
答案 1 :(得分:5)
如果在catch块中使用throw,它将重新抛出异常。如果在catch块之外使用throw,它将终止应用程序。
答案 2 :(得分:1)
从不,永远不要使用catch(...),因为您可能会捕获您不想捕获的应用程序错误,例如错误,访问冲突(取决于你如何编译)。
阅读伟大的John Robbins一书(调试Windows应用程序),其中详细解释了为什么不应该这样做。