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

标签 c++ exception try-catch rethrow

这段代码是吗

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/

相关文章:

java - Intellij IDEA异常断点条件下调用自定义函数

Javascript在try block 内设置const变量

c++ - C/C++ : Taking the address of a function imported from a shared library

c++ - std::threads 构造函数参数错误

c++ - 在 Python-C++-C-Fortran 2003 程序中链接英特尔的 MKL

用于引起/包装异常的 Spring ExceptionHandler

c++ - 用字符串指定 vector 的类型

Java 无法访问 FileNotFoundException 的 catch block

java - Java中try catch中的圆括号/括号()是什么

python - 如何在 Python 中捕获自定义异常