如果有多个例外情况发生,会发生什么情况,以及如何捕获它们?

时间:2019-12-02 10:51:18

标签: c++ exception

我希望我能更明确一些,但是在很多情况下,有几个例外正在运行中-都涉及析构函数,但仍然如此。

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

我敢说“在有几个例外情况发生时,没有办法抓住”。

2 个答案:

答案 0 :(得分:4)

您可能会阅读throw的文档。

  

如果任何由堆栈展开机制直接调用的函数,在初始化异常对象之后且在异常处理程序启动之前,都将退出并退出异常,将调用std::terminate。这些函数包括具有自动存储期限的对象的析构函数,其作用域已退出,并且异常对象的副本构造函数被调用(如果不消除),以初始化按值捕获参数。

因此,调用std::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");
}

答案 1 :(得分:0)

从来没有“正在运行的几个例外”。

如果在展开过程中引发异常,则程序将终止。

如果处理程序引发了异常,则该异常之前的异常将不再运行。