Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Плещёв ВУМИП 2012-07-06.doc
Скачиваний:
66
Добавлен:
13.05.2015
Размер:
9.35 Mб
Скачать

1.6.3. Свойства и конструкторы исключений

Message- текст, выводимый обработчиком в окне сообщения.

HelpContext‑ номер экрана контекстно‑зависимой справки, вызы­ваемой клавишейF1из окна сообщения об ошибке. Файл справки предварительно нужно создать и связать его с приложением командойProject/Options/Application/Help file (п. 5.1).

Конструкторы (методы) исключений позволяют сформировать свойстваMessageиHelp.

Create(const Msg: string).

CreateFmt(const Msg: string, const Args:array of const).

CreateRes(Ident: integer).

CreateResFmt(Ident:integer, const Args:array of const).

CreateHelp(const Msg: string, HelpContext:integer).

CreateFmtHelp(const Msg: string, const Args:array of const, HelpContext).

CreateResHelp(Ident,HelpContext:integer).

CreateResFmtHelp(Ident:integer, const Args:array of const, HelpContext).

Конструкторы, в имени которых нет FmtилиRes, присваивают свой­ствуMessageзначение аргументаMsg.

Конструкторы, в имени которых есть Fmt, содержат параметрMsgс описанием формата редактирования элементов массиваArgs(аналогично функцииFormat). Конструкторы, в имени которых естьHelp, присваивают свойствуHelpContextзначение одноименного аргумента.

Конструкторы, в имени которых есть Res, параметромIdentзадают идентификатор строки ресурса (п. 1.3.1.2) сообщения или строки описания формата, если в имя входитFmt.

Примерыиспользования конструкторов:

TypeEmy=Class(Exception); // создание класса исключений (п. 1.6.9)

RaiseEmy.Create(‘Ошибка в параметрах’);//генерация исключения (п.1.6.7)

RaiseEmy.CreateFmt(‘Задано %d, а нужно%d’,[4,9]); // формат. сообщение

RaiseEZeroDivide.Create(‘Деление на ноль’); // генерация исключения

RaiseEmy.CreateRes(9); //свойствоMessage=строке ресурсов с номером 9

Raise Emy.CreateResFmt(8,[5,7]); // Message=отформатированные 5 и 7.

1.6.4. Блок зачисткиTry‑Finally‑End

Try <операторы>Finally<всегда выполняемые операторы>End;

Операторы, которые указаны после Finally, выполняются и при успешном, и при аварийном завершении работы операторов, указанных передFinally. Это позволяет корректно завершить работу программы в исключительной ситуации, например, освободить динамически выделен­ную память, закрыть файлы, удалить временные файлы.

1.6.5. Зачистка в разделе модуляFinalization

В этом разделе можно проверить, завершается программа нормально (ExceptAddr=Nil) или аварийно, используя функциюExceptAddr. Для этого следует указать хотя бы пустой раздел модуляInitialization.

1.6.6. Блок обработки исключенийTry‑Except‑End

Try <операторы>Except <обработка исключений> [Else<операторы>]End;Операторы, которые указаны послеExcept, выполняются только при аварийном завершении работы операторов, указанных передExcept. Для задания обработки исключений в этом блоке используются операторы:

On<класс исключений>Do<оператор> или другие операторы; смешение операторовOnс другими операторами не допускается.

Операторы, указанные после Else, выполняются для всех, не перехва­чен­ных ранее исключений.

Пример:

Var A,C,B: Shortint;

Begin A:=1; B:=100;

Try

C:=StrToInt(Edit1.Text); A:=(B Div C); //обычное выполнение

Except//начало блока обработки исключений

OnEConvertErrorDoShowMessage('Ошибка ‑ не число! Повторите ввод');

OnEdivByZeroDoShowMessage('Ошибка ‑ ноль!Повторите ввод');

On EIntOverFlow Do If (B*C)>=0 Then A:=127 Else A:=‑128;

End;//окончание блока

Некоторые исключения имеют дополнительные свойства (поля). Например, исключение EinOutErrorимеет свойствоErrorCodeтипаIntegerс кодом ошибки ввода‑вывода. Для использования таких свойств. ОператорOnзаписывается в виде:

On <метка>:<класс исключений>Do

<операторы с конструкциями <метка>.<свойство>;

Примерконтроля за операциями файлового ввода - вывода:

On10:EinOutErrorDo//начало обработки исключений при вводе ‑ выводе

BeginCase10.ErrorcodeOf//оператор выбора варианта обработки

2: S:=’Файл ‘+S+’ не найден!’; //код ошибки=2

106: S:=’Ошибка ввода при работе с файлом ‘+S; //ошибка=106

End; //окончание обработки вариантов ошибок

ShowMessage(S); //вывод сообщения об ошибке

End; //окончание обработки исключений при вводе‑выводе

Допускаются конструкции вида:

Try ... Try ... Finally ... End; Except ... [Else ... ] End;

Допускается вложенность блоковTry...Except. В этом случае внача­ле ищется обработчик в блоке, в котором создалось исключение, и если его нет, то продолжается поиск в обрамляющем блоке, и. т. д.