Лабораторный практикум по основам языка C/С++ |
Тема 1. Генерация исключений
Исключительная ситуация – это событие, которое возникает в ходе выполнения программы, нарушающее корректность выполнения кода. В С++ исключение - это реакция на нештатную (исключительную) ситуацию, возникающую во время выполнения программы. Эта ситуация может возникнуть в редких (исключительных) случаях, тогда как в остальное время код будет работать корректно. Базовый принцип, на котором основана обработка исключений — восстановление состояния и выбор альтернативных действий в случае ошибки. Предположим, в программе имеется некий блок 100%-ая работоспособность которого под вопросом, то есть программист не уверен, что он доработает до конца в любых условиях. При выполнении блока может возникнуть нехватка памяти или начнутся проблемы с коммуникациями, или нехороший клиентский объект передаст неверный параметр. Возникает соблазн написать программу в таком виде:
if (блок будет работать) {
блок;
}
else {
сделать что-то другое;
}
Невозможно предсказать будущее, можно лишь создать специальные конструкции, которые обезопасят ваш код. Первым вариантом является создание большого количества условных операторов, которые будут везде проверять корректность данных и выдавать сообщения об ошибке. Однако такой подход сильно загромождает код, а частый вывод сообщений об ошибке может сделать работу с приложением неудобной. С помощью же исключений вы «допрашиваете» подозрительный блок. Если в нем обнаружится ошибка, компилятор поможет восстановить состояние перед выполнением блока и продолжить работу
Блок, в котором исключительная ситуация не сможет привести к завершению выполнения
программы называется защищенным. Он описывается при помощи служебного слова try
. Внутри защищенного блока исключительная ситуация генерируется при помощи служебного слова throw
. Перехват же и обработка исключительной ситуации происходит в специальном блоке, описываемом служебным словом catch
. Общая структура обработки исключительной ситуации показана ниже:
try {
...
throw класс_исключительной_ситуации(параметры);
...
}
catch (класс_исключительной_ситуации объект) {
обработка исключения;
}
В самом простом случае программист просто генерирует исключение со строкой текста об ошибке. Ниже приведен пример функции, в которой может возникнуть одна из двух ошибок: "отрицательное значение возраста" и "год рождения больше текущего".
Результат для года рождения 1980
Результат для года рождения 2080
Результат для года рождения -1980
Поскольку генерируется строка текста, а это константный указатель на массив
типа char
, то в блоке catch
мы указываем конкрентый тип
исключения. Это позволяет сделать для одного и того же блока несколько вариантов
обработки исключений. В последнем блоке catch
может быть указано многоточие, как в приведенном примере. Такой блок перехватывает все остальные исключения, которые не подходят ни под один блок перехвата, которые приведены выше.
В нашем случае в блоке просто выводится сообщение о том, что возникло непредвиденное исключение.