- •1) Анализ.
- •2)Проектирование.
- •Методы объектов
- •Методы класса и данные класса
- •Инкапсуляция
- •Директивы видимости
- •Инкапсуляция при помощи свойств(новое в дельфи)
- •Свойства массивы
- •Многомерные массивы свойств
- •Индексированные свойства
- •Ссылочная модель Дельфи. (см тетрадь) Наследование
- •Наследование и совместимость типов
- •Безопасное преобразование типов
- •Интерфейсы
- •Технические приемы, связанные с реализацией интерфейса.
- •Обработка исключений.
- •Создание пользовательской особой (исключительной ситуации)
- •[]_[] Ссылки на классы []_[]
- •Создание компонентов при помощи ссылок на класс
- •Класс tObject
- •Конструктор Create класса tObject.
- •События.
- •Указатели на методы
Создание пользовательской особой (исключительной ситуации)
Программисты могут создавать собственные исключения, производя новый подкласс от стандартного класса исключения или от одного из его потомков.
Пример
Type
EArrayFull = class (Exception);
If MyArray.Full
Then raise 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;
|
|
_ _