Рубрики

Обработка исключений в C ++

Одним из преимуществ C ++ перед C является обработка исключений. Исключениями являются аномалии или ненормальные условия, возникающие во время выполнения программы. Существует два типа исключений: а) синхронный, б) асинхронный (например: которые находятся вне контроля программы, сбой диска и т. Д.). C ++ предоставляет следующие специализированные ключевые слова для этой цели.

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

catch : представляет блок кода, который выполняется, когда выбрасывается определенное исключение.

throw : используется для выброса исключения. Также используется для перечисления исключений, которые выдает функция, но не обрабатывает сама себя.

Почему обработка исключений?

Ниже приведены основные преимущества обработки исключений по сравнению с традиционной обработкой ошибок.

1) Отделение кода обработки ошибок от нормального кода: в традиционных кодах обработки ошибок всегда есть условия для обработки ошибок. Эти условия и код для обработки ошибок перепутаны с обычным потоком. Это делает код менее читаемым и обслуживаемым. При использовании блоков try catch код для обработки ошибок становится отдельным от обычного потока.

2) Функции / методы могут обрабатывать любые исключения, которые они выберут: функция может выдавать много исключений, но может решить обрабатывать некоторые из них. Другие исключения, которые выброшены, но не перехвачены, могут быть обработаны вызывающей стороной. Если вызывающий абонент решает не перехватывать их, исключения обрабатываются вызывающим абонентом.
В C ++ функция может указывать исключения, которые она выдает, используя ключевое слово throw. Вызывающий эту функцию должен каким-то образом обработать исключение (либо указав его снова, либо перехватив)

3) Группировка типов ошибок: в C ++ как базовые типы, так и объекты могут быть выброшены как исключение. Мы можем создать иерархию объектов исключений, группировать исключения в пространствах имен или классах, классифицировать их по типам.

Обработка исключений в C ++

1) Ниже приведен простой пример, демонстрирующий обработку исключений в C ++. Вывод программы объясняет ход выполнения блоков try / catch.

#include <iostream>

using namespace std;

  

int main()

{

   int x = -1;

  

   // некоторый код

   cout << "Before try \n";

   try {

      cout << "Inside try \n";

      if (x < 0)

      {

         throw x;

         cout << "After throw (Never executed) \n";

      }

   }

   catch (int x ) {

      cout << "Exception Caught \n";

   }

  

   cout << "After catch (Will be executed) \n";

   return 0;

}

Выход:

Before try
Inside try
Exception Caught
After catch (Will be executed)

2) Существует специальный блок catch под названием «catch all» catch (…), который можно использовать для перехвата всех типов исключений. Например, в следующей программе int вызывается как исключение, но для int нет блока catch, поэтому будет выполнен блок catch (…).

#include <iostream>

using namespace std;

  

int main()

{

    try  {

       throw 10;

    }

    catch (char *excp)  {

        cout << "Caught " << excp;

    }

    catch (...)  {

        cout << "Default Exception\n";

    }

    return 0;

}

Выход:

Default Exception

3) Неявное преобразование типов не происходит для примитивных типов. Например, в следующей программе «а» неявно преобразуется в int

#include <iostream>

using namespace std;

  

int main()

{

    try  {

       throw 'a';

    }

    catch (int x)  {

        cout << "Caught " << x;

    }

    catch (...)  {

        cout << "Default Exception\n";

    }

    return 0;

}

Выход:

Default Exception

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

#include <iostream>

using namespace std;

  

int main()

{

    try  {

       throw 'a';

    }

    catch (int x)  {

        cout << "Caught ";

    }

    return 0;

}

Выход:

terminate called after throwing an instance of 'char'

This application has requested the Runtime to terminate it in an 
unusual way. Please contact the application's support team for 
more information.

Мы можем изменить это ненормальное поведение завершения, написав нашу собственную неожиданную функцию .

5) Исключение из производного класса должно быть перехвачено до исключения из базового класса. Смотрите это для более подробной информации.

6) Как и Java, библиотека C ++ имеет стандартный класс исключений, который является базовым классом для всех стандартных исключений. Все объекты, созданные компонентами стандартной библиотеки, являются производными от этого класса. Таким образом, все стандартные исключения могут быть перехвачены с помощью этого типа

7) В отличие от Java, в C ++ все исключения не проверяются. Компилятор не проверяет, поймано ли исключение или нет (подробности см. В этом ). Например, в C ++ нет необходимости указывать все неперехваченные исключения в объявлении функции. Хотя это рекомендуемая практика. Например, следующая программа компилируется нормально, но в идеале сигнатура fun () должна содержать список непроверенных исключений.

#include <iostream>

using namespace std;

  
// Подпись этой функции хороша компилятором, но не рекомендуется.
// В идеале функция должна указывать все неперехваченные исключения и функцию
// подпись должна быть "void fun (int * ptr, int x) throw (int *, int)"

void fun(int *ptr, int x)

{

    if (ptr == NULL)

        throw ptr;

    if (x == 0)

        throw x;

    / * Некоторая функциональность * /

}

  

int main()

{

    try {

       fun(NULL, 0);

    }

    catch(...) {

        cout << "Caught exception from fun()";

    }

    return 0;

}

Выход:

Caught exception from fun()

8) В C ++ блоки try-catch могут быть вложенными. Кроме того, исключение может быть переброшено с использованием «throw; »

#include <iostream>

using namespace std;

  

int main()

{

    try {

        try  {

            throw 20;

        }

        catch (int n) {

             cout << "Handle Partially ";

             throw;   // Повторно выбрасываем исключение

        }

    }

    catch (int n) {

        cout << "Handle remaining ";

    }

    return 0;

}

Выход:

Handle Partially Handle remaining

Функция также может повторно вызывать функцию, используя тот же «throw; «. Функция может обработать деталь и может попросить вызывающего обработать оставшуюся часть.

9) Когда выдается исключение, все объекты, созданные внутри окружающего блока try, уничтожаются до того, как элемент управления передается в блок catch.

#include <iostream>

using namespace std;

  

class Test {

public:

   Test() { cout << "Constructor of Test " << endl; }

  ~Test() { cout << "Destructor of Test "  << endl; }

};

  

int main() {

  try {

    Test t1;

    throw 10;

  } catch(int i) {

    cout << "Caught " << i << endl;

  }

}

Выход:

Constructor of Test
Destructor of Test
Caught 10

10) Вы можете попробовать викторину по обработке исключений в C ++ .

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

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

Обработка исключений в C ++

0.00 (0%) 0 votes