构造函数/析构函数中的异常处理

本文讨论了C++中构造函数和析构函数的异常处理。在C++中,构造函数通过抛出异常来通知对象构造失败,而析构函数不应抛出异常,以避免栈展开过程中引发的程序崩溃。析构函数内部应封装可能的异常,确保不将其传播出去。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    对于出错处理,在C语言时代,使用的方法就是返回一个错误代码。预定义一系列的代码标识,当发生指定的错误时候,调用过程返回对应该类型错误的代码。
    这种方法简单,但是不适合复杂的应用。它会导致若干的问题,比如:
    1.质量下降。使用错误代码,那么必然需要在处理中对不同的代码进行分支处理。而分支过程包含错误可能性是其他方式的10倍。消除分支,代码将更加健壮。
    2.增加成本。一方面,由于分支,那么白盒法测试时的测试条件个数增多,延长测试过程;另一方面,控制流程的复杂性导致维护成本上升。
    3. ....

    然而更糟糕的是,C++的构造/析构函数不允许有返回值,没有返回类型,所以使用错误代码的方法被一锤打死了。也许有人会想到使用出参的方式返回错误代码,但是这个方法对于OO特性是存在冲突的,其详细分析可参见参考资料2。因此,通知对象的构造失败的唯一方法那就是在构造函数中抛出异常。
   
    构造函数异常,可以总结如下:
    1.C++中通知对象构造失败的唯一方法那就是在构造函数中抛出异常;
    2.构造函数抛出异常时,析构函数将不会被执行;
    3.抛出异常时,其子对象将被逆序析构。(参考析构过程)

    析构函数异常相对要复杂一些,存在一种冲突状态,程序将直接崩溃:异常的被称为“栈展开(stack unwinding)”【备注】的过程中时,从析构函数抛出异常,C++运行时系统会处于无法决断的境遇,因此C++语言担保,当处于这一点时,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值