gpt4 book ai didi

c++ - catch-all-rethrow 与完全没有 try-catch block 有什么不同吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:43 28 4
gpt4 key购买 nike

是否有这段代码

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com