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

📅  最后修改于: 2021-05-30 10:35:14             🧑  作者: Mango

异常处理–将基类和派生类捕获为异常:

如果基类和派生类都被捕获为异常,则派生类的catch块必须出现在基类之前。

如果我们把基类放在首位,那么派生类的catch块将永远不会到达。例如,以下C++代码打印“ Caught Base Exception”(捕获的基本异常)

#include
using namespace std;
  
class Base {};
class Derived: public Base {};
int main()
{
   Derived d;
   // some other stuff
   try {
       // Some monitored code
       throw d;
   }
   catch(Base b) { 
        cout<<"Caught Base Exception";
   }
   catch(Derived d) {  //This catch block is NEVER executed
        cout<<"Caught Derived Exception";
   }
   getchar();
   return 0;
}

在上面的C++代码中,如果我们更改catch语句的顺序,则两个catch语句都可以到达。以下是经过修改的程序,并显示“捕获的派生异常”

#include
using namespace std;
  
class Base {};
class Derived: public Base {};
int main()
{
   Derived d;
   // some other stuff
   try {
       // Some monitored code
       throw d;
   }
   catch(Derived d) { 
        cout<<"Caught Derived Exception";
   }
   catch(Base b) { 
        cout<<"Caught Base Exception";
   }
   getchar();
   return 0;
}

在Java,编译器本身不允许在派生之前捕获基类异常。在C++中,编译器可能会对此发出警告,但会编译代码。
例如,以下Java代码在编译时失败,并显示错误消息“派生异常已被捕获”

//filename 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) {}
  }
}
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”