C++面向对象入门(五十一)异常处理中的构造和析构

C++异常处理的真正能力不仅在于它可以处理各种不同类型的异常, 也在于它可以具有为异常对象抛出前try内构造的所有局部对象
调用析构函数的能力
在程序中, 找到一个匹配的catch异常处理后, 如果catch子句的异常类型声明是一个值参数, 则其初始化方式是复制被抛掷的异常对象,
如果catch子句的异常类型声明是一个引用类型, 其初始化方式是使该引用指向异常对象
catch子句的异常类型声明参数被初始化后, 栈的展开过程便开始了, 这包括将对应try块开始到异常被抛掷处间的构造(且尚未析构)的
所有自动对象进行析构.
析构顺序与构造顺序正好相反, 然后程序从最后一个catch块之后开始恢复执行
 
代码示例:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

/*
C++异常处理的真正能力不仅在于它可以处理各种不同类型的异常, 也在于它可以具有为异常对象抛出前try内构造的所有局部对象
调用析构函数的能力

在程序中, 找到一个匹配的catch异常处理后, 如果catch子句的异常类型声明是一个值参数, 则其初始化方式是复制被抛掷的异常对象,
如果catch子句的异常类型声明是一个引用类型, 其初始化方式是使该引用指向异常对象

catch子句的异常类型声明参数被初始化后, 栈的展开过程便开始了, 这包括将对应try块开始到异常被抛掷处间的构造(且尚未析构)的
所有自动对象进行析构.

析构顺序与构造顺序正好相反, 然后程序从最后一个catch块之后开始恢复执行
*/

class A71 {
public:
    ~A71()
    {
        ofstream log_no71("log_No71.txt", ios::app);
        log_no71 << "~A71" << endl;
        log_no71.close();
    }
};

class B71 {
public:
    ~B71()
    {
        ofstream log_no71("log_No71.txt", ios::app);
        log_no71 << "~B71" << endl;
        log_no71.close();
    }
};


class C71 {
public:
    ~C71()
    {
        ofstream log_no71("log_No71.txt", ios::app);
        log_no71 << "~C71" << endl;
        log_no71.close();
    }
};


class D71 {
public:
    ~D71()
    {
        ofstream log_no71("log_No71.txt", ios::app);
        log_no71 << "~D71" << endl;
        log_no71.close();
    }
};

ofstream log_no71("log_No71.txt", ios::app);

int main()
{
    A71 a;
    try
    {
        B71 b1;
        B71 b2;
        C71 c1;
        C71 c2;
        C71 c3;
        D71 d1;
        D71 d2;
        D71 d3;
        D71 d4;
        throw double(1);
    }
    catch (...)
    {
        log_no71 << "catch and handle a exception." << endl;
    }
    log_no71.close();
    return 0;
}

 

posted @ 2020-09-09 21:30  DNoSay  阅读(197)  评论(0编辑  收藏  举报