在异常类的层次结构中,catch语句的正确排序是什么,以便允许捕获异常类层次结构中多个类的异常?
它最多是派生到基数还是基数到大多数派生的?
答案 0 :(得分:4)
大部分派生于第一位。处理程序按它们出现的顺序进行匹配,因此您首先需要最具体的处理程序。
答案 1 :(得分:1)
我的答案是根据linux编译器,希望它应该适用于所有人。 渔获量的顺序取决于两个因素:
(1) 先来先选择 ;如果在派生之前出现基类,那么它将被选择。一些编译器警告说,有些则没有;
(2) 继承类型 ;公共或非公共(私人/受保护)
struct B {};
struct D : B {};
struct DD : D {};
int main()
{
for(int i = 0; i < 3; i++)
{
try
{
switch(i)
{
case 0: throw new B;
case 1: throw new D;
case 2: throw new DD;
}
}
catch(B *o) { cout<<"B* caught\n"; }
catch(D *o) { cout<<"D* caught\n"; }
catch(DD *o) { cout<<"DD* caught\n"; }
}
}
(1)在上面的代码中,它总是捕获B.如果您通过捕获DD,D,B来更改订单,那么它将根据您的期望来获得派生类。
(2)现在将'struct'替换为'class'或将继承更改为private / protected;在上面的代码中,无论顺序如何,捕获量都与投掷类型相匹配。它将是如此严格,即使您删除任何Derived类的catch,它也不会被Base类捕获。
答案 2 :(得分:0)
正确的排序应该是最先导出的。处理程序必须按从大多数派生到基类的顺序排列 这是一个代码示例:
#include <iostream>
using namespace std;
class MyException
{
public:
MyException(int value):mValue(value)
{
}
int mValue;
};
class MyDerivedException: public MyException
{
public:
MyDerivedException(int value, int anotherValue):MyException(value),mAnotherValue(anotherValue)
{
}
int mValue;
int mAnotherValue;
};
void doSomething()
{
//Lot of Interesting stuff
//Exception condition
throw MyDerivedException(10,20);
}
int main()
{
try
{
doSomething();
}
catch(MyDerivedException &exception)
{
cout<<"\nCaught Derived Class Exception\n";
}
catch(MyException &exception)
{
cout<<"\nCaught Base Class Exception\n";
}
return 0;
}
在上面的示例中,处理程序按Derived类(MyDerivedException)排序,然后按Base类(MyException)排序。如果这些处理程序的顺序颠倒过来,那么Base类处理程序将捕获抛出的所有异常(即使它们属于Derived类)。这是因为总是可以将Derived类对象/指针分配给Base类的对象/指针,而无需任何类型转换或显式处理。
第h