Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_po_OOP док.doc
Скачиваний:
13
Добавлен:
28.03.2015
Размер:
313.34 Кб
Скачать

Создание пользовательской особой (исключительной ситуации)

Программисты могут создавать собственные исключения, производя новый подкласс от стандартного класса исключения или от одного из его потомков.

Пример

Type

EArrayFull = class (Exception);

If MyArray.Full

Then reaise EArrayFull.Create(‘Массив заполнен’);

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

// у метода Create, наследуемого от класса Exception существует строковый параметр, который описывает пользователю возникшую исключительную ситуацию.

* Программисту не нужно заботиться об уничтожении объекта, созданного для обработки исключения – его удаление выполняется автоматически.

Tools>Debugger Options > Language Exceptions > o Stop on Delphi Exceptions

Синтаксис Дельфи для исключительных ситуаций представляет возможность для создания исключений …….

Procedure FT1.BtnClick (Sender: TObject);

Var F:TextFile; //new in Delphi

Ans:word;

Begin

AssignFile(F, Ed1.Text);

Try

Append

Try

Writeln(F, ‘….’), ….writeln(F, ‘…’);

Finally

Close(F);

End

Except

On E:EInOutError do

Begin

If E.ErrorCode=2 then{file not found}

Begin

Ans:=MessageDlg(‘Cannot find file ’+Edit1/Text+’.’#13+’would you like to create it?’, intError, [mbYes,mbNo],0)

If Ans=mrYes then FileCreate(Edit2.Text)

End

Else

Raise;{порождаем исключительную ситуацию заново}

End;

End;

//если же произошло какое либо другое исключение то обработчик порождает его заново, передавая обработку вверх по цепочке каким – либо другим кодом. Таким образом мы не должны обеспечивать обработку для каждого класса исключений внутри каждого блока try…..except .

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

*********** Для определения возникло ли исключение EInOutError использовалось значение ErrorCode <<<????

Такое поле не определено в базовом классе Exception. Оно является частью класса EInOutError

Type EInOutError = class (Exception)

Public

ErrorCode : integer;

End;

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

Пример :

Обычно не известно какая ситуация может привести к возникновению исключения, также невозможно заключить каждый фрагмент кода в блок try….except, можно воспользоваться следующим подходом: обработку всех исключений возложить на Дельфи и при этом вести журнал ошибок. А потом его можно проанализировать:

У объекта Application есть событе onException и компонент ApplicatonEvents.

На форму добавим компонент ApplicatonEvents и напишем обработчик события onException.

Procedure TF1.logException(Sender:Tobject; E:Exception);

Var FileName: string; logFile:TextFile;

Begin

FileName:=ChangeFileExt(Application.Exename. ‘.log’);

assignFile(LogFile, FileName);

if FileExists (FileName) then Append(logFile)

else ReWrite(LogFile); {открываем существующий файл или создаем новый}

writeln(LogFile, DateTimeToStr(Now)+’:’+E.Message);

if not CheckBoxSilent.Checked then Applivation.ShowException(E);

CloseFile(LogFile); // файл можно закрыть сразу или на событии onClose формы.

End;

_ _

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]