#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
不懂,求教
C++异常机制是"最先匹配",而不是"最佳匹配"。如果代码中你把catch (CExcept2){}放到catch (CExcept0){}的前边,就会出现你想要的结果:C CCC。
这样放三个catch有什么意义呢,反正异常会最先匹配第一个。您能解释一下吗?
@HelloWorld_Hai: 因为不同的情况会抛出不同的异常,所以会有多个catch去捕捉对应的异常。不会总是匹配第一个啊,比如你把catch(CExcept0){}这段删掉,重新运行,输入0,就会报错,因为没有匹配到。
@躺着喝水: 道理我懂,但是switch选择2不是抛出Except2这个异常吗?
@HelloWorld_Hai: 抛出的except2()可以被catch(CExcept0) catch(CExcept1) catch(CExcept2),捕获啊,因为继承自CExcept1,CExcept1继承自CExcept0。
@HelloWorld_Hai: 你是说为啥这样写,有什么意义。这确实没什么意义,实际项目也不会这样写,这只不过是学习的练习题。
@躺着喝水: 非常感谢您!