Обработка исключительных ситуаций

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

Исключения бывают:

  1. аппаратными – генерируются со стороны процессора и включают в себя обращение к невыделенной памяти, деление на 0, выход за грани разрядной сетки или массива;
  2. программными – генерируются со стороны системы или каких-либо программ в случае их прямого инициирования. Обычно это происходит, когда аномальную ситуацию обнаруживает часть программы.

Задача структурной обработки заключается в однотипной работе с программными и аппаратными исключениями.

Подробнее о механизме обработки

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

С целью запустить обработку исключений пользователи «C++» используют такие выражения, как:

  1. «try» – используется для включения одного или нескольких операторов, которые создают исключение;
  2. «throw» – в качестве операнда во время передачи информации об ошибках используются объекты любого типа, что применимо только для программных исключений и является признаком того, что исключительные условия происходят в блоке «try»;
  3. «catch» – каждый из этих блоков указывает на тот тип исключения, который может быть обработан.

С целью обработки создаваемых исключений после блока «try» реализуют 1 или несколько блоков «catch». Непосредственно за блоком «try» находятся разделы кода под защитой. При этом выражение «throw» используют для вызова исключения. Блок кода, идущий за «catch» – обработчик исключения, он должен перехватывать исключение, когда имеется совместимость типов в «throw» и «catch». В случаях, когда со стороны оператора «catch» будет задано «…» – блок сможет обработать все исключения.

Так как любой из блоков «catch» обрабатывается по алгоритму, заданному программой, то обработчик с многоточием – последний обработчик для блока «try», который будет ему соответствовать. Зачастую блок «catch» используют с целями ведения журналов ошибок или для проведения очищения, предшествующего остановке выполнения программы.

try { … // защищенный раздел кода
throw параметр;
}
catch (параметр) { // обработка исключения }
catch (…) { // обработка остальных исключений }

Пример, связанный с обработкой программных исключений, приведён ниже. Реальные программы требуют команды «throw» при посылке исключения, как правило, это следствие проверки каких-либо условий.

#include <iostream>
using namespace std;
int main() {
try {
cout << «Exception: «;
throw 1;
cout << «No exception!»;
} catch (int a) {
cout << a;
}
cin.get(); return 0;
}

или

#include <iostream>
using namespace std;
int main() {
try {
cout << «Exception: «;
//throw 1;
cout << «No exception!»;
} catch (int a) {
cout << a;
}
cin.get(); return 0;
}

Несколько слов об обработке структурного исключения

В данном случае приведён пример, связанный с исключительной ситуацией – делением на 0.

#include <iostream>
using namespace std;
int main() {
int a = 0, b =10;
cout << b/a << endl;cin.get();
return 0;
}

Во время попыток запуска программы отмечается такая картина:

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

#include <iostream>
using namespace std;
int main() {
int a = 0, b = 10;
try {
cout << b / a << endl;
}
catch (…)
{
cout << «error»;
}
cin.get();
return 0;
}

Корректный запуск программы предполагает осуществление настроек среды разработки с последующим разрешением обработки структурного исключения. Для этого выбираем Имя проекта – Свойства.

Далее для пункта меню «C/C++» выбираем Code Generation – Enable C++ Exceptions для установки значения «Yes With SEH Exceptions (/EHa)».

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

Компиляция с параметром «/EHa» может вызывать подключение к обрабатываемым исключениям структурированных исключений «C» и асинхронных исключений. Последние могут быть связаны с делением на 0 и числами, имеющими плавающую запятую.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *