异常在构造函数try块中被捕获,并被处理,但仍然会被第二次重抛。

我试图更好地理解处理继承时的throw-catch机制。

我想解决的问题是,如果在构造派生类时,先构造的基类抛出了一个异常,会发生什么情况。

#include <stdexcept>
#include <iostream>

class Base
{
    public:
    Base()
    {
        throw  std::runtime_error("test");
    }
};


class Derived : public Base
{
    public:
    Derived() try : Base()
    {

    }
    catch (std::runtime_error& e)
    {
        std::cout <<  "Base throws an exception : " << e.what() << std::endl;
    }    
};


int main ()
{
   Derived temp;
   return (0);
}

在运行我的编译代码(g++ std=11)后,我得到以下消息。

基类抛出一个异常:测试

在抛出’std::runtime_error’实例后,调用 terminate。

what(): 测试

终止(核心转储)

我的由Base抛出的异常被Derived构造函数的try-catch捕获,但是由于某些原因,抛出的异常并没有停止,这是为什么,如何解决这个问题?

如果有更好的方法来处理base类在构造衍生类时可能抛出的异常,我愿意接受建议。

解决方案:

C++的一个基本核心原则是,一个对象只有在对象的构造函数返回后才能完全构造。当执行进入类的构造函数时,类本身就会被 还没有构建。只有它的类成员是(还有任何基类)。只有当构造函数返回时,只有 然后 对象已经完全构造好了,你就有了一个完全熟透的对象可以玩了。

因此,在构造函数中出现thrown异常意味着对象被 构。完全停止。故事结束。这就是她写的所有内容。这个规则没有例外(双关语)。

现在,当你捕获一个从基类的构造函数中抛出的异常时,这意味着什么?好吧,你可以这样做,但这并不能改变一个事实,即一个异常被抛出,而基类没有被构造。这意味着派生类 不能 的类被构造出来。你不能期望执行到异常处理程序的末端,然后返回父类,好像这个类已经完全构造好了,没有错误。

这种情况是不会发生的。你不能以某种方式,最终导致基类没有被构造出来,但派生类却被构造出来了。C++不是这样工作的。

当你从基类中捕获一个异常时,你只有两个选择。

1) 你的异常处理程序可以在做完它想做的事情后,重新抛出它自己的异常。

2) 否则,如果异常处理程序返回时没有抛出自己的异常,C++将为你重抛异常。

给TA打赏
共{{data.count}}人
人已打赏
未分类

Reactor Mono发布到多个方法

2022-9-8 22:55:23

未分类

C++ varadic模板混合了值、数组和对象。

2022-9-8 22:55:25

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索