Тема 1. Генерация исключений

Исключительная ситуация – это событие, которое возникает в ходе выполнения программы, нарушающее корректность выполнения кода. В С++ исключение - это реакция на нештатную (исключительную) ситуацию, возникающую во время выполнения программы. Эта ситуация может возникнуть в редких (исключительных) случаях, тогда как в остальное время код будет работать корректно. Базовый принцип, на котором основана обработка исключений — восстановление состояния и выбор альтернативных действий в случае ошибки. Предположим, в программе имеется некий блок 100%-ая работоспособность которого под вопросом, то есть программист не уверен, что он доработает до конца в любых условиях. При выполнении блока может возникнуть нехватка памяти или начнутся проблемы с коммуникациями, или нехороший клиентский объект передаст неверный параметр. Возникает соблазн написать программу в таком виде:

 if (блок будет работать) { 
	 блок;
 }
 else {
	 сделать что-то другое;
 }

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

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

 try { 
	 ...
	 throw класс_исключительной_ситуации(параметры);
	 ...
 }
 catch (класс_исключительной_ситуации объект) {
	 обработка исключения;
 }

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

Результат для года рождения 1980

Результат для года рождения 2080

Результат для года рождения -1980

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