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

问题描述 投票:2回答:1

这个代码吗?

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

在语义上与仅仅呼叫有任何不同

opaque_function_that_might_throw_arbitrary_exception ();

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

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

c++ exception try-catch rethrow
1个回答
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绝对是自由的。

© www.soinside.com 2019 - 2024. All rights reserved.