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


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

Пример

 

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;

 

   

 

 


_ _

[]_[] Ссылки на классы []_[]

Это элемент языка, который в процессе выполнения программы позволяет манипулировать не экземплярами классов а самими классами. Ссылка на класс – это не класс и не объект, это ссылка на тип данных.

Предположим, имеется класс TMyClass.

//Определим ссылку на этот класс

Type

TMyClassRef = class of TMyClass;

 

//Можно объявить переменные обоих типов

 

Var AClassRef : TMyClassRef;

AnObject : TMyClass;

 

Begin

AClassRef:= TMyClassRef;

AnObject:=TMyClass.Create;

 

End;

 

*Зачем нужны ссылки на класс?

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

//Определим ссылку на этот класс

Type

TMyClassRef = class of TMyClass;

 

//Можно объявить переменные обоих типов

 

Var AClassRef : TMyClassRef;

AnObject : TMyClass;

 

Begin

AClassRef:= TMyClassRef;

AnObject:=TMyClass.Create;

 

//new

AClassRef:=TMyClass;

AnObject:=AClassRef.Create;

 

End;

 

*Здесь конструктор Create применен к ссылке на класс вместо настоящего класса.

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

 

Например:

Переменной типа ссылка на класс (TMyClassRef) можно присвоить как соответствующий ей конкретный класс, так и любой из его классов – потомков.

Type

TMyNewClass = class ( TMyClass )

End;

……………………..

AClassRef:=TMyClass;

AClassRef:=TMyNewClass;

 

В библиотеках RealTypeLibrary и ??? RealTimeLibrary ??? определено много ссылок на класс.

…………

Type

TClass = class of TObject;

ExceptClass = class of Exception;

TComponentClass = class of TComponent;

TControlClass = class of TControl;

TFormClass = class of Tform;

……………

 

Ссылку на класс типа TClass можно использовать для хранения ссылки на любой класс Delphi (т.к. ссылается на TObject).

 

Ссылка TFormClass используется в исходном коде большинства проектов Дельфи. Метод CreateForm объекта Application требует в качестве параметра класс формы, которую нужно создать.

 

Application.CreateForm(Tform1, Form1); //1 - ссылка на класс, 2 – переменная, хранящая ссылку на созданный экземпляр объекта.

Кроме того ссылку на класс можно применять к методам связанного с ней класса(или наоборот????).

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

 



Дата добавления: 2016-07-27; просмотров: 1107;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.014 сек.