Описание обработчика исключений в блоке try..Except
Основным способом реализации исключений является их обработка с помощью блоковtry ... except. Синтаксис этих блоков следующий:
Try
{исполняемый код} except
{код исполняемый в случае генерации исключения} end;
В случае возникновения исключения в блоке обработки можно предпринять определенные действия: известить пользователя о возникшей проблеме, подсказать ему пути ее решения, принять какие-то меры к исправлению ошибки и т.д.В разделеexcept можно определить тип сгенерированного исключения и дифференцированно реагировать на различные исключительные ситуации. Это делается с помощью оператора: оа <хласс исключения» do <оператор>;
Рассмотрим пример. Пусть в программе содержится следующий код: С: = StrToInt (Editl. Text) ; А: = В div С;
Его детальное рассмотрение показывает, что этот код является потенциально опасным по следующим причинам:
· введенная пользователем строка в поле Editl может оказаться не числом;
· введенная пользователем строка в поле Editl может оказаться нулем;
· при выполнении деления потенциально может возникнуть ошибка переполнения.
Поэтому данный код необходимо заключить в блок обработки исключений. Пример: try
С := StrToInt(Editl.Text); А := В/С; except
On EConvertError do
MessageDlg ('Вы ввели ошибочное число; повторите ввод',
mtWarning, [тЬОК], 0) ;
On EDivByZero do
MessageDlg {'Быввели нуль; повторите ввод',
mtWarning, [тЬОК], 0);
On EIntOverFlow do
if (B*C) >=0 then A:=32767 else A:= -32766; end;
B рассматриваемом примере некоторые исключения имеют дополнительные поля (свойства), уточняющие вид ошибки. Например, это относится к исключению файлового ввода-выводаEXnOutError, которое имеет свойство ErrorCode типаinteger. Это свойство содержит стандартный для Object Pascal номер ошибки файлового ввода/вывода. Для использования полей исключения, операторon записывается в виде: on <имя>: <класс исключения» do
<операторы с конструкциями <имя>.<имя поля»;
Содержащееся в операторе on имя имеет локальную область видимости, нигде не определяется и используется для ссылки на поле по имени объекта исключения. Пусть в переменной filename хранится имя обрабатываемого
файла, тогда пример использования полей исключения при операциях файлового ввода/вывода можно представить так: on IO: EInOutError do begin
Case IO.ErrorCode of
2: s: = 'Файл ' + s + " не найден'; 3: s:= "Ошибочное имя файла ' + s; 4: s:= "Слишком много открытых файлов';
5: в:= "Файл ' + а + " не доступен'; I
100: з:= "Достигнут конец файла ' + з; 101: з:= 'Диск переполнен при работе с файлом ' + з; 106: з:= 'Ошибка ввода при работе с файлом ' + я;
end;
MessageDlg (з, mtWarning, fmbOK], 0);
end;
Можно перехватывать не только отдельные исключения, но и группы
родственных исключений, обрабатывая определенный уровень иерархии.
Например, чтобы перехватить исключения всех классов, порожденных от EIntError:
On EIntError do
MessageDlg ( "Ошибка целочисленной операции' , mtWarning, [mbOKJ, 0)
В раздел except могут включаться или только оператор on или только
какие-то другие операторы. Помимо оперзтора on, обрабатывающего заданные
классы исключений, в раздел except может быть включен операторelse, в
котором выполняется обработка всех, не перехваченных ранее исключений, т.е. происходит обработка по умолчанию: except
on ... on ...
else <обработчик всех не перехваченных ранее событий»;
end;
Омератор else должен идти последним, иначе все обработчики будут перехвачены уже в этом операторе. Внутри обработчика по умолчанию можно получить доступ к объекту исключения с помощью функции ExceptObject. Использовать обработку исключении «по умолчанию» следует осторожно, поскольку перехват всех исключений способен замаскировать какие-то
непредвиденные ошибки в программе, что затруднит их поиск и снизит
надежность работу.
Процедура обработки исключения в блоках try...except Клоки try...except могут быть вложены явным или неявным образом. Примером неявной вложенности является блок try...except, в котором среди операторов ра )дела try имеются вызовы функций илипроцед>р, которые имеют спои собственные try...except. Рассмотрим последовательность обработки
исключений в этих случаях. При генерации исключения сначала ищется соответствующий ему обработчикon в том блокеtry ... except, в котором создалась исключительная ситуация. Если соответствующий обработчик не найден, поиск ведется во внешнем блокеtry ... except (при наличии явным образом вложенных блоков) и т.д. Если в данной функции или процедуре обработчик не найден или вообще в ней отсутствуют блокиtry ... except, то поиск переходит на следующий уровень - в блок, из которого была вызвана данная процедура или функция. Этот поиск продолжается по всем уровням. И только если он закончился безрезультатно, выполняется стандартная процедура обработки исключения. Как только операторon, соответствующий данному исключению, найден и выполнен, объект исключения разрушается и управление передается оператору, следующему за тем блокомtry ...except, в котором был осуществлен перехват.
Возможен также вариант, когда в самом обработчике исключения в процессе обработки возникает исключительная ситуация. В этом случае обработка прерывается, прежнее исключение разрушается и генерируется новое исключение. Его обработчик ищется в блокеtry. .except, внешним по отношению к тому, в котором возникло новое исключение.
Если исключение не перехвачено нигде в программе, то оно обрабатывается методомTApplication. HandleException. Он обеспечивает стандартную реакцию: вывод информационного окна и уничтожение экземпляра исключения. При этом управление не возвращается к тому обработчику событий, код которого привел к возникновению исключения.
Если п, ограмма, вызвавшая исключения выполнялась в среде Delphi, то кроме стандартного окна, выводится еще сообщения отладчика Delphi. При этом управление автоматически передается в Редактор кода Delphi, на строку, оператор в которой вызвал исключение. Такой режим можно отключить командой главного менюTools->Debugger Options->Language Exceptions и выключить опциюBreak On Exception.