这个代码吗?
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
绝对是自由的。