Исключения — это условия, при которых нормальный ход программы, т. е. последовательность вызовов методов в стеке вызовов, невозможен или нежелателен. Надо понимать разницу между исключением и ожидаемым событием (скажем, обнаружение конца файла). Если у вас есть метод, последовательно считывающий файл, вы понимаете, что в какой-то момент будет достигнут его конец. Такое событие по природе своей вряд ли является
исключительным
и, конечно, не должно прерывать выполнение программы. Если же вы пытаетесь прочитать файл, а ОС уведомляет вас о дисковой ошибке, это, разумеется, исключительная ситуация, и именно такая, что повлияет на нормальный ход работы вашего метода при его попытке продолжить считывание файла.
Большинство исключений связано и с другой проблемой —
контекстом.
Рассмотрим пример. Допустим, вы пишете код с сильными связями — код, в котором один метод отвечает за одно свое действие. Он может выглядеть примерно так:
public void Foo() <
while (Ifile.IsEOFO)
<
String record = file.ReadRecordO;
>
CloseFileO; >
public void OpenFileCString fileName) {
// Пытаемся заблокировать и открыть файл.
}
Если возникнет сбой в методе
OpenFile,
этот метод не сможет обработать ошибку. Дело в том, что он отвечает только за открытие файлов. Он не может определить, с чем связана проблема при открытии файла: с катастрофической ошибкой или просто недоразумением. Следовательно,
OpenFile
не может обработать ошибку, поскольку он, что называется, не находится в верном контексте.
Собственно поэтому и существуют обработчики исключений: один метод обнаруживает наличие исключительной ситуации, но оказывается не в том контексте, чтобы реагировать на ошибку. Он сигнализирует исполняющей среде, что возникла ошибка. Исполняющая среда последовательно проходит по стеку вызовов, пока не находит метод, способный правильно работать с ошибкой. Понятно, что это приобретает особую остроту, когда метод, находящийся на пятом уровне вложенности, сталкивается с ошибкой, а обработать ее корректно может только метод первого уровня. Давайте рассмотрим синтаксис, применяемый при обработке исключений.