Современный пользователь должен знать об особенностях обработки исключительных ситуаций, поскольку исключение является таким событием во время выполнения программы, которое может привести к нарушениям в её поведении.
Исключения бывают:
- аппаратными – генерируются со стороны процессора и включают в себя обращение к невыделенной памяти, деление на 0, выход за грани разрядной сетки или массива;
- программными – генерируются со стороны системы или каких-либо программ в случае их прямого инициирования. Обычно это происходит, когда аномальную ситуацию обнаруживает часть программы.
Задача структурной обработки заключается в однотипной работе с программными и аппаратными исключениями.
Подробнее о механизме обработки
Процесс обработки имеет в основе главный принцип, когда в надежде решения возникших проблем, функция, которой они были обнаружены, начинает генерацию исключения. При этом функцией, которая способна решить проблему такого рода, будет указано, что она перехватила такое исключение.
С целью запустить обработку исключений пользователи «C++» используют такие выражения, как:
- «try» – используется для включения одного или нескольких операторов, которые создают исключение;
- «throw» – в качестве операнда во время передачи информации об ошибках используются объекты любого типа, что применимо только для программных исключений и является признаком того, что исключительные условия происходят в блоке «try»;
- «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 и числами, имеющими плавающую запятую.