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肯定是解脱了