Создание пользовательской особой (исключительной ситуации)
Программисты могут создавать собственные исключения, производя новый подкласс от стандартного класса исключения или от одного из его потомков.
Пример
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; просмотров: 1203;