catch-all-rethrow与完全没有try-catch块有什么不同?

时间:2017-12-17 20:05:14

标签: c++ exception try-catch rethrow

这段代码

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

在语义上与仅调用

有任何不同
opaque_function_that_might_throw_arbitrary_exception ();

在C ++中?标准之间是否存在差异?

我虽然两个片段在语义上都是相同的,但我检查了编译器 - 资源管理器,它生成了不同的代码,即使在最高的优化级别。这让我想知道是否有一些我不知道的东西。

1 个答案:

答案 0 :(得分:4)

是的,某个特定地方存在细微差别。考虑这个主要功能:

int main() {
   RAIIHandle important_resource{ /*...*/ };

   opaque_function_that_might_throw_arbitrary_exception ();
}

important_resource是否因为异常而被释放?好吧,它是实现定义的。调用std::terminate,但如果异常从main转义,则堆栈可能无法展开。对于某些资源,这可能会带来真正的麻烦。

现在在这种情况下:

int main() {
   try {
     RAIIHandle important_resource{ /*...*/ };
     opaque_function_that_might_throw_arbitrary_exception ();
   }
   catch(...) {
     throw;
   }
}
仍然会调用

std::terminate。但是在找到异常的合适处理程序之前。堆栈必须展开。所以我们的important_resource肯定会被释放。