📜  捕获基类和派生类为异常

📅  最后修改于: 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) {}
  }
}