Общий механизм обработки исключений

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

Исключительная ситуация, или исключение — это возникновение непредвиденного

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

аппаратуры. Например, это деление на ноль или обращение по несуществующему

адресу памяти. Обычно эти события приводят к завершению программы с системным сообщением об ошибке. C++ дает программисту возможность восстанавливать программу и продолжать ее выполнение.

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

Исключения позволяют логически разделить вычислительный процесс на две части

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

Другое достоинство исключений состоит в том, что для передачи информации об

ошибке в вызывающую функцию не требуется применять возвращаемое значение,

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

Общий механизм обработки исключений

Место, в котором может произойти ошибка, должно входить в контролируемый

блок — составной оператор, перед которым записано ключевое слово try.

Рассмотрим, каким образом реализуется обработка исключительных ситуаций.

• Обработка исключения начинается с появления ошибки. Функция, в которой

она возникла, генерирует исключение. Для этого используется ключевое слово

throw с параметром, определяющим вид исключения. Параметр может быть

константой, переменной или объектом и используется для передачи информации

об исключении его обработчику.

• Отыскивается соответствующий обработчик исключения и ему передается

управление.

• Если обработчик исключения не найден, вызывается стандартная функция

terminate, которая вызывает функцию abort, аварийно завершающую текущий

процесс. Можно установить собственную функцию завершения процесса.

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: