Лекция 31 Обработка исключений 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лекция 31 Обработка исключений



Цели лекции:

1. Изучение возбуждения исключительных ситуаций.

2. Рассмотрение обработчика исключений с использованием try-блока.

3. Рассмотрение механизма, с помощью которого можно связать список исключений с объявлением функции.

 

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

Когда встречается аномальная ситуация, та часть программы, которая ее обнаружила, может сгенерировать, или возбудить, исключение.

Исключительная ситуация - особое состояние программы, при возникновении которого работа программы (или отдельного блока) должна прерываться с передачей управления обработчику прерывания.

Исключения С++ не поддерживают обработку асинхронных событий, таких как ошибки оборудования или обработку прерываний, например нажатие клавиши Ctrl+C. Механизм исключений C++ предназначен только для событий, которые являются результатом работы самой программы и которые описаны явно в программе.

Исключения позволяют разделить описание вычислительного процесса на части - обнаружение особой (аварийной) ситуации и ее обработка. Этим достигается лучшая структуризация программы.

Другое достоинство исключений состоит в том, что для передачи информации об ошибке в вызывающий код не требуется применять возвращаемое значение, параметры или глобальные переменные. Интерфейс функций не загромождается. Это особенно важно, например, для конструкторов, которые, в соответствии с определенным для них синтаксисом, не могут возвращать значение.

Рассмотрим простой пример: требуется выделить память под массив int A[1000].

Первый способ (традиционный) связан с использованием оператора if:

set_new_handler(0);

int* A= new int[1000];

if (A==0) { cerr << "Нет памяти!\n"; exit(-1); }

Простым средством обработки исключительных ситуаций является функция errhalt из модуля syst.h. Ниже приведен пример программы определения фактического размера оперативной (виртуальной) памяти, построенной с применением этой функции.

/* Пример 5_01_1 */

#include <syst.h>

void main()

{ set_new_handler(0);

char* p;

int i, N=1024*1024L;

for (i=0;;i++)

{ p= new char[N];

if (p==NULL) { printf("Size of free virtual memory = %d Mb\n",i);

exit(0); }

}

}

Второй способ состоит в использовании макроподстановки assert:

#include <assert.h>

int* A = new int[1000];

assert(A!= 0);

Третий способ связан с использованием специальных средств обработки особых ситуаций.

Обработчик исключения представляет собой специальную функцию (точнее процедуру), которая имеет стандартное имя catch и которая располагается непосредственно за блоком контроля try.

 

Операторы try, throw, catch

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

От того насколько внимательно ваше приложение обрабатывает все ошибочные ситуации, зависит насколько надежно и устойчиво оно будет работать. Например, если приложение по мере своей работы должно получать у операционной системы большие блоки памяти и вы не учтете возможности, что оперативной памяти окажется недостаточно, приложение может вызвать срабатывание защиты памяти.

В языке Си++ реализованы специальные операторы try, throw и catch предназначенные для обработки ошибочных ситуаций, которые называются исключениями.

Оператор try открывает блок кода, в котором может произойти ошибка. Если ошибка произошла, то оператор throw вызывает исключение. Исключение обрабатывается специальным обработчиком исключений. Обработчик исключения представляет собой блок кода, который начинается оператором catch.

Допустим приложение должно вычислять значение выражения res = 100 / (num * (num - 7)). Если задать значение переменной num, равное 0 или 7, то произойдет ошибка деления на нуль. Участок программы, в котором может случиться ошибка, объединить в блок оператора try. Вставить перед вычислением выражения проверку переменной nem на равенство нулю и семи. Если переменная num примет запрещенные значения, вызовем исключение, воспользовавшись оператором throw.

Сразу после блока try поместить обработчик исключения catch. Он будет вызываться в случае ошибки.

Программа Exception принимает от пользователя значение переменной num, а затем вычисляет выражение res = 100 / (num * (num - 7)) и отображает полученный результат на экране.

В случае, если пользователь введет число 0 или 7, тогда вызывается исключение throw. В качестве параметра оператору throw указывается переменная num. Заметим, что так как переменная num имеет тип long, считается что данное исключение также будет иметь тип long.

После вызова оператора throw управление сразу передается обработчику исключения соответствующего типа. Определенный нами обработчик отображает на экране строку "Exception, num = ", а затем выводит значение переменной num.

После обработки исключения, управление не возвращается в блок try, а передается оператору, следующему после блока catch данного обработчика исключения. Программа выведет на экран строку “Stop program” и завершит свою работу.

Если пользователь введет разрешенные значения для переменной num, тогда исключение не вызывается. Программа вычислит значение res и отобразит его на экране. В этом случае обработчик исключения не выполнится и управление перейдет на оператор, следующий за блоком обработки исключения. Программа выведет на экран строку “Stop program” и завершит работу.

Файл Exception.cpp

#include <iostream.h>

int main()

{

long num = 7;

long res = 0;

// Введите число num

cout << "Input number: ";

cin >> num;

// Блок try, из которого можно вызвать исключение

try {

if((num == 7) || (num == 0))

// Если переменная num содержит значение 0 или 7,

// тогда вызываем исключение типа float

throw num;

 

// Значения num равные 0 или 7 вызовут ошибку

// деления на нуль в следующем выражении

res = 100 / (num * (num - 7));

 

// Отображаем на экране результат вычисления

cout << "Result = " << res << endl;

}

 

// Обработчик исключения типа float

catch(long num)

{

// Отображаем на экране значение переменной num

cout << "Exception, num = " << num << endl;

}

 

cout << "Stop program" << endl;

return 0;

}

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

catch(long)

{

// Отображаем на экране значение переменной num

cout << "Exception, num = " << num << endl;

}

 



Поделиться:


Последнее изменение этой страницы: 2021-02-07; просмотров: 125; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.226.166.214 (0.012 с.)