13.12 构造函数、析构函数与异常处理
优质
小牛编辑
130浏览
2023-12-01
首先要处理前面已经提到但还没有完全解决的问题。构造函数中发现错误时会发生什么情况?
例如,String 构造函数在 new 失败和无法取得保持 String 的内部表示所需空间时如何响应?问题是构造函数无法返回数值,如何让外部知道对象没有顺利构造呢,一种方案是返回没有正确构造的对象,希望对象使用者通过相应测试确定该对象是不能使用的对象。另一种方案是在构造函数之外设置一些变量。抛出的异常向外部传递失败的构造函数信息.并负责处理这个故障。
要捕获异常,异常处理器要访问所抛出对象的复制构造函数(默认成员的副本也有效)。
构造函数中抛出异常时,对抛出异常之前要构造的对象调用析构函数。
抛出异常之前每个 try 块中构造的自动对象都调用析构函数。异常在开始执行处理器时处理,这时堆栈解退一定已经完成。如果堆栈解退调用析构函数而抛出异常,则调用 terminate。如果对象有成员函数.且如果异常在外层对象构造完成之前抛出,则执行发生异常之前所构造成员对象的析构函数。如果发生异常时部分构造了对象数组,则只调用已构造数组元素的析构函数。
异常可能越过通常释放资源的代码,从而造成资源泄漏。要解决这个问题,一种方法是在请求资源时初始化一个局部对象,发生异常时,调用析构函数井释放资源。
要捕获析构函数中抛出的异常,可以将调用析构函数的函数放在 try 块中,并提供相应类型的 catch 处理器。所抛出对象的析构函数在异常处理器执行完毕之后执行。