catch-all-rethrow 与完全没有 try-catch 块有什么不同吗?
Does catch-all-rethrow differ in any way from having no try-catch block at all?
是否有此代码
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
肯定是解脱了
是否有此代码
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
肯定是解脱了