当飞行中出现多个异常时会发生什么,以及如何捕获它们?

Hri*_*sip 1 c++ exception

我希望我能更明确,但是有很多可能的场景在飞行中有几个例外——都涉及析构函数,但仍然如此。

从 C++98 到 C++17 的行为有何不同?

我敢于预言“飞行中有几个例外,没有办法抓住”。

Jar*_*d42 6

您可能会阅读throw 的文档。

如果任何由堆栈展开机制直接调用的函数,在异常对象初始化之后和异常处理程序开始之前,以异常退出,std::terminate则调用。此类函数包括具有自动存储持续时间的对象的析构函数,其范围已退出,以及被调用(如果未省略)以初始化按值捕获参数的异常对象的复制构造函数。

Sostd::terminate被称为而不是“飞行中的几个例外”

您可能仍然有几个例外,只要它们不退出各自的功能:

void foo()
{
    struct S
    {
        ~S()
       {
           try {
               throw std::runtime_error("in S");
           } catch (const std::exception& ex) {
               std::err << ex.what(); // "in S"
           }
       }
    } s;

    throw std::runtime_error("In Foo");
}
Run Code Online (Sandbox Code Playgroud)