📅  最后修改于: 2020-06-28 05:21:12             🧑  作者: Mango
异常处理: 将基类和派生类捕获为异常
如果基类和派生类都被捕获为异常,则派生类的catch块必须出现在基类之前。
如果我们把基类放在首位,那么派生类的catch块将永远无法到达。例如,以下C +代码打印“ Caught Base Exception”
#include
using namespace std;
class Base {};
class Derived: public Base {};
int main()
{
Derived d;
// 别的东西
try {
throw d;
}
catch(Base b) {
cout<<"基类异常";
}
catch(Derived d) { // 这个catch块不会被执行
cout<<"派生类异常";
}
getchar();
return 0;
}
在上面的C++代码中,如果我们更改catch语句的顺序,则两个catch语句都可以到达。以下是经过修改的程序,它显示“捕获的派生异常”
#include
using namespace std;
class Base {};
class Derived: public Base {};
int main()
{
Derived d;
// 一切其他的
try {
throw d;
}
catch(Derived d) {
cout<<"派生类异常";
}
catch(Base b) {
cout<<"基类异常";
}
getchar();
return 0;
}
在Java中,编译器本身不允许在派生之前捕获基类异常。在C++中,编译器可能会对此发出警告,但会编译代码。
例如,以下Java代码在编译时失败,并显示错误消息“派生异常已被捕获”
//文件名 Main.java
class Base extends Exception {}
class Derived extends Base {}
public class Main {
public static void main(String args[]) {
try {
throw new Derived();
}
catch(Base b) {}
catch(Derived d) {}
}
}