Рубрики

Ловля базовых и производных классов как исключения

Обработка исключений — перехват базовых и производных классов в качестве исключений:

Если и базовый, и производный классы перехвачены как исключения, блок catch производного класса должен находиться перед базовым классом.

Если сначала поставить базовый класс, блок захвата производного класса никогда не будет достигнут. Например, следующий код C ++ выводит «Caught Base Exception»

#include<iostream>

using namespace std;

  

class Base {};

class Derived: public Base {};

int main()

{

   Derived d;

   // некоторые другие вещи

   try {

       // Некоторый отслеживаемый код

       throw d;

   }

   catch(Base b) { 

        cout<<"Caught Base Exception";

   }

   catch(Derived d) {  // Этот блок catch НИКОГДА не выполняется

        cout<<"Caught Derived Exception";

   }

   getchar();

   return 0;

}

В приведенном выше коде C ++, если мы изменим порядок операторов catch, тогда оба оператора catch станут достижимыми. Ниже приведена модифицированная программа, которая печатает «Пойманное производное исключение».

#include<iostream>

using namespace std;

  

class Base {};

class Derived: public Base {};

int main()

{

   Derived d;

   // некоторые другие вещи

   try {

       // Некоторый отслеживаемый код

       throw d;

   }

   catch(Derived d) { 

        cout<<"Caught Derived Exception";

   }

   catch(Base b) { 

        cout<<"Caught Base Exception";

   }

   getchar();

   return 0;

}

В Java перехват исключения базового класса перед производным не разрешен самим компилятором. В C ++ компилятор может предупреждать об этом, но компилирует код.
Например, следующий Java-код завершается неудачно при компиляции с сообщением об ошибке «Исключение Derived уже перехвачено»

// имя файла 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) {}

  }

}

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Ловля базовых и производных классов как исключения

0.00 (0%) 0 votes