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

C++ 飞行中出现多个异常时会发生什么情况,以及如何捕获它们?,c++,exception,C++,Exception,我希望我能说得更清楚一些,但有太多可能的情况,飞行中有几个异常——都涉及到析构函数,但仍然存在 从C++98到C++17的行为有什么不同 我敢预言“当飞行中有几个例外时,就没有办法捕捉到了。”你可能会读到《博士》 如果在初始化异常对象之后和启动异常处理程序之前,堆栈展开机制直接调用的任何函数带着异常退出,std::terminate。此类函数包括具有自动存储持续时间的对象的析构函数(其作用域已退出),以及调用(如果未省略)以初始化按值捕获参数的异常对象的复制构造函数 因此调用了std::term

我希望我能说得更清楚一些,但有太多可能的情况,飞行中有几个异常——都涉及到析构函数,但仍然存在

从C++98到C++17的行为有什么不同

我敢预言“当飞行中有几个例外时,就没有办法捕捉到了。”

你可能会读到《博士》

如果在初始化异常对象之后和启动异常处理程序之前,堆栈展开机制直接调用的任何函数带着异常退出,
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");
}
void foo()
{
结构
{
~S()
{
试一试{
抛出std::runtime_错误(“S”);
}捕获(const std::exception&ex){
std::err您可能会阅读的文档

如果堆栈展开机制直接调用的任何函数在初始化异常对象之后和启动异常处理程序之前,以异常方式退出,则调用
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");
}
void foo()
{
结构
{
~S()
{
试一试{
抛出std::runtime_错误(“S”);
}捕获(const std::exception&ex){
std::err飞行中从来没有“几次例外”

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

如果一个异常是由处理程序引发的,那么它前面的异常将不再飞行。

从来没有“飞行中的多个异常”

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


如果异常是由处理程序引发的,则它前面的异常将不再处于飞行状态。

请下次尝试更明确一些,您可能已经注意到,自C++11以来,场景的数量并没有那么多;)它仍然只是一个“飞行中”的异常尽管如此。请下次尝试更明确一些,您可能已经注意到,自C++11以来,场景的数量并没有那么多;),但这仍然只是“飞行中”的一个例外尽管如此。直接强调。只要它没有逃逸解绕机制直接调用的代码,你就可以了。因此,从。直接强调。只要它没有逃逸解绕机制直接调用的代码,你就可以了。因此,从。那么叫什么?@Adler我想这取决于你对我说什么“在飞行中”是一个例外,但对我来说,这并不算是“在飞行中”。这就是你的例子。你在任何退绕发生之前都在观察。这些例外是“在飞行中”吗?嗯,我想这取决于你如何定义。我不会。地面上的飞机不是“在飞行中”@formerlyknownas_463035818,那么,为什么它不在
std::uncaught_exceptions()之后立即终止呢==1
又抛出了一个异常?@Adler如果你手头有一个具体的案例,但不把它们包括在问题中,那么问题就出在讨论代码中。我建议你打开一个关于这段代码的新问题。@Adler因为,正如我所说,你还没有解开。那叫什么来着?@Adler我想我是这样的这取决于你所说的“在飞行中”是什么意思。但对我来说,这并不算是“在飞行中”。这就是你的例子的想法。你在任何退绕发生之前都在观察。这些例外情况是“在飞行中”吗?嗯,我想这取决于你如何定义。我不会。地面上的飞机不是“在飞行中”@formerlyknownas_463035818,那么,为什么它不在
std::uncaught_exceptions()之后立即终止呢==1
又抛出了一个异常?@Adler如果你手头有一个具体的案例,但不将它们包括在问题中,那么问题就出在讨论代码中。我建议你打开一个关于这段代码的新问题。@Adler因为,正如我所说,你还没有解开。