在异常类的层次结构中,为了允许捕获异常类层次结构中的多个类的异常,catch语句的正确顺序是什么?
它是最基本的派生,还是最基本的派生?
发布于 2011-04-07 02:37:14
最先派生的。处理程序是按照它们出现的顺序进行匹配的,因此您需要首先获得最具体的处理程序。
发布于 2011-04-07 04:37:07
我的答案是根据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;在上面的代码中,无论顺序如何,捕获都将匹配抛出的类型。它将是如此严格,即使你移除了派生类的任何捕获,它也不会被基类捕获。
发布于 2011-04-07 04:25:27
正确的排序应该是派生最多的。处理程序的顺序必须是从大多数派生类到基类。
下面是一个代码示例:
#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;
}
在上面的示例中,处理程序被排序为派生类(MyDerivedException),然后是基类(MyException)。如果这些处理程序的顺序颠倒,则基类处理程序将捕获抛出的所有异常(即使它们属于派生类)。这是因为人们总是可以将派生类的对象/指针分配给基类的对象/指针,而无需任何类型转换或显式处理。
Hth。
https://stackoverflow.com/questions/5575307
复制