这段代码是吗
try
{
opaque_function_that_might_throw_arbitrary_exception ();
}
catch (...)
{
throw;
}
在语义上与仅仅调用有任何不同
opaque_function_that_might_throw_arbitrary_exception ();
在 C++ 中?标准之间有差异吗?
虽然两个片段在语义上是相同的,但我检查了编译器浏览器,它生成了不同的代码,即使在最高优化级别也是如此。这让我想知道我是否遗漏了一些东西。
最佳答案
是的,在一个特定的地方存在细微的差异。考虑这个主要功能:
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
肯定被释放了。
关于c++ - catch-all-rethrow 与根本没有 try-catch block 有什么不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47858959/