首页 新闻 会员 周边

请教一个C++关于异常的程序阅读题

0
悬赏园豆:20 [已解决问题] 解决于 2016-12-20 17:05
#include "iostream"
using namespace std;

class CMyExcept
{
    void writeout(){cout<<"XXX\n";}
};

class CExcept0: public CMyExcept
{
public: void  writeout(){cout<<"AAA\n";}
};

class CExcept1: public CExcept0
{
public: void writeout(){cout<<"BBB\n";}
};

class CExcept2: public CExcept1
{
public: void writeout(){cout<<"CCC\n";}
};


void main()
{

    char ch;
    try{
        cin>>ch;
        switch(ch)
        {
        case '0': throw CExcept0();
        case '1': throw CExcept1();
        case '2': throw CExcept2();
        }
    }
    catch(CExcept0)
    {
        cout<<'A'<<endl;
        CExcept0 a;
        a.writeout();
    }
    catch(CExcept1)
    {
        cout<<'B'<<endl;
        CExcept1 b;
        b.writeout();
    }
    catch(CExcept2)
    {
        cout<<'C'<<endl;
        CExcept2 c;
        c.writeout();
    }
}

代码和运行结果如上图。

我认为运行结果是: C

                          CCC

不懂,求教

Henry2017的主页 Henry2017 | 初学一级 | 园豆:8
提问于:2016-12-19 19:33
< >
分享
最佳答案
0

C++异常机制是"最先匹配",而不是"最佳匹配"。如果代码中你把catch (CExcept2){}放到catch (CExcept0){}的前边,就会出现你想要的结果:C  CCC。

收获园豆:20
躺着喝水 | 初学一级 |园豆:157 | 2016-12-20 09:51

这样放三个catch有什么意义呢,反正异常会最先匹配第一个。您能解释一下吗?

Henry2017 | 园豆:8 (初学一级) | 2016-12-20 10:18

@HelloWorld_Hai: 因为不同的情况会抛出不同的异常,所以会有多个catch去捕捉对应的异常。不会总是匹配第一个啊,比如你把catch(CExcept0){}这段删掉,重新运行,输入0,就会报错,因为没有匹配到。

躺着喝水 | 园豆:157 (初学一级) | 2016-12-20 13:32

@躺着喝水: 道理我懂,但是switch选择2不是抛出Except2这个异常吗?

Henry2017 | 园豆:8 (初学一级) | 2016-12-20 15:53

@HelloWorld_Hai: 抛出的except2()可以被catch(CExcept0) catch(CExcept1) catch(CExcept2),捕获啊,因为继承自CExcept1,CExcept1继承自CExcept0。

躺着喝水 | 园豆:157 (初学一级) | 2016-12-20 16:54

@HelloWorld_Hai: 你是说为啥这样写,有什么意义。这确实没什么意义,实际项目也不会这样写,这只不过是学习的练习题。

躺着喝水 | 园豆:157 (初学一级) | 2016-12-20 16:59

@躺着喝水: 非常感谢您!

Henry2017 | 园豆:8 (初学一级) | 2016-12-20 17:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册