- •1. Новые концепции ооп в языке Oblect Pascal
- •2. Объектно-ориентированный подход в программировании
- •Основные понятия
- •3. Понятие класса и объекта
- •4. Поля, методы и свойства объекта
- •5. Ключевое слово Self, примеры использования
- •6. Перегруженные методы
- •7. Создание и удаление объектов
- •8. Инкапсуляция
- •9. Инкапсуляция и модули
- •10. Директивы видимости
- •11. Инкапсуляция при помощи свойств
- •12. Свойства-массивы
- •13. Индексированные свойства
- •14. Свойства и иерархия классов
- •15. Конструкторы, перегрузка конструкторов, 16. Деструкторы
- •17. Ссылочная модель объектов Delphi
- •18. Наследование
- •19. Совместимость типов
- •20. Полиморфизм и позднее связывание
- •21. Виртуальные, динамические методы
- •22. Абстрактные методы
- •23. Бе6зопасное преобразование типов
- •24. Ссылки на класс
- •25. Создание компонентов при помощи ссылок на класс
- •26. Интерфейсы
- •27. Технические приемы, связанные с использованием интерфейсов (делегирование, использование директивы implements)
- •28. Исключительные ситуации
- •29. Порядок выполнения программы и блок finally
- •30. Классы исключений
- •31. Исключения и отладка приложений
- •32. Класс tObject, использование методов класса Tobject
- •33. Понятие события
- •34. Обработчики событий. Делегирование в Delphi
- •35. События стандартных визуальных компонент и их использование
29. Порядок выполнения программы и блок finally
try помечает начала защищённого участка кода.
except обозначает конец защищённого участка кода и начало операторов обработки исключения. Синтаксис следующий: on ТипИсключения do.
finally специфицирует код, который выполнится в любом случае, даже если произошло исключение. В рамках фрагмента кода, помеченного этим ключевым словом, как правило выполняются разного рода завершающие операции.
raise позволяет породить исключительную ситуацию.
Большинство исключений генерируются системой, но можно самостоятельно породить исключение в программе, например, когда на этапе выполнения обнаруживается некорректность. Кроме того, ключевое слово raise можно использовать внутри обработчика исключений, чтобы породить исключение заново. Это может потребоваться для того, чтобы передать исключение следующему обработчику. Однако, механизм обработки исключений не является заменой необходимости тестирования аргументов функции.
Например, теоретически можно написать следующий код:
Function Ex1(A,B:integer):integer;
Begin
Try
Result:= A div B; //возможно деление на 0
……………….
Result:=Result+1;
Except
On EDivByZero do
Result:=0;
End;
End;
В рассмотренном примере возможно вообще не имеет смысла выполнять обработку исключения, вместо этого следует просто выполнить проверку и отобразить на экране сообщение об ошибке – алгоритм, обратившийся в данной функции не должен продолжать работу, т.к. в рез - е выполнения функции было получено бессмысленное значение.
Использование блока finally.
Пример:
Будут выполняться длительные вычисления а на экране будет отображаться курсов в виде песочных часов.
Function Tform1.Btn1Click(sender:object);
Var I,j:integer;
Begin
Screen.Cursos:=czHourGlass;
J:=0;
For i:=1000 downto 0 do
J := j + j div I; {деление на 0}
messageDlg(‘Total: ’,+IntToStr(j), mtInformation, [mbOK], 0);
screen.Cursos:=csDefault;
End;
При попытке деления на 0 программа прервется, но курсор по умолчанию не будет восстановлен. Для того чтобы исправить ситуацию используется блок try..finally.
Function Tform1.Btn2Click(sender:object);
Var I,j:integer;
Begin
Screen.Cursos:=czHourGlass;
try
J:=0;
For i:=1000 downto 0 do
J := j + j div I; {деление на 0}
messageDlg(‘Total: ’,+IntToStr(j), mtInformation, [mbOK], 0);
finally
screen.Cursos:=csDefault;
End;
В данном случае программа восстановит вид курсора в независимости от того, произошло исключение или нет.
Рассмотренный пример не осуществляет обработку исключения, а просто осуществляет корректный выход из программы. За блоком try может следовать либо блок except либо блок finally, но не оба блока одновременно. В случае, если необходимо также добавить и обработку исключения, то стандартное решение – применить два вложенных блока try.
Пример 3
Function Tform1.Btn3Click(sender:object);
Var I,j:integer;
Begin
Screen.Cursos:=czHourGlass;
Try try
J:=0;
For i:=1000 downto 0 do
J := j + j div I; {деление на 0}
messageDlg(‘Total: ’,+IntToStr(j), mtInformation, [mbOK], 0);
finally
screen.Cursos:=csDefault;
except
on E:EDivByZero do // E – временный объект исключения
begin
raise Exception.Create(‘Ошибка в алгоритме’);
end;
end;
end;
End;
Каждый раз, когда в программу добавляется некий завершающий код, его необходимо размещать в разделе finally. Это будет хорошей защитой от утечек памяти и некорректного использования ресурсов. Обработка самого исключения возможно менее важна т.к. Дельфи с этим нормально справляется.
