DELPHISOURCE

Домой | Статьи | Книги | FAQ | Компоненты | Программы
Архив сайта | Реклама на сайте | Ссылки | Связь

Обработка исключительных ситуаций


http://www.delphi.agava.ru/


Как возникают исключительные ситуации?


Существует множество источников исключительных ситуаций. Например, программой могут быть сгенерированны исключения из-за какого-то ненормального состояния. Исключения генерируются компонентами Delphi для различных событий, таких как присвоение свойству значения, выходящего за допустимые пределы, или попытка индексировать несуществующий элемент массива.

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

Вот некоторые типы операций, которые могут привести к исключительным ситуациям:

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

В Object Pascal есть несколько ключевых слов для создания и обработки исключений. Это try, except, on-do-else, finally, raise и at.

 

Блоки защищенных опереаторов

Блок защищенных операторов -  основное средство для обработки исключительных ситуация. Ниже показана схема создания блока защищенных операторов с помощью блоков try и except. Обратите внимание, что конструкция заканчивается ключевым словом end;

try
{операторы, которые могут вызвать ошибку(сгенерировать исключение)}
except
{опереаторы для обработки сгенерированных исключений}
end; 

 

Этот пример демонстрирует возникновение исключительной ситуации при делении на ноль.
procedure TForm1.Button1Click(Sender: TObject);
Var

   I, J, K: integer;
begin
   I:=0;
   J:=10;
  try
     K := J div I;
     showmessage(inttostr(k));
  except
     Showmessage ('Ошибка! Деление на ноль.');
  end;
end;

 

!  Внимание! При тестировании исключительных ситуаций желательно отключить утилиту отслеживания сообщений WinSight32, если она запущена. Также, если вы используете Delphi 4, выберите команду Tools => Debugger Options и на вкладке Language Exception снимите флажок Stop on Delphi Exception.
Теперь исключения не будут отлавливаться средой Delphi и управление исключительными ситуациями полностью предается вашему приложения.

 

Блоки защищенных ресурсов

Вывод сообщений об ошибке - это только один аспект обработки исключительных ситуаций. Устойчивое приложение должно восстанавливать стабильное состояние системы при возникновении аварийных ситуаций. Для создания блоков защищенных ресурсов используют блоки try и finally.

Схема создания блока защищенных ресурсов:
try
{операторы, которые могут вызвать ошибку(сгенерировать исключение)}
finally
{освободить ресурс; гарантированно будет выполнено}
end;
{продолжить, если в блоке try не возникло исключительных ситуаций} 

 

 

Пример использования блока защищенных ресурсов:

procedure TForm1.Button1Click(Sender: TObject);
Var

   I, J, K: integer;
   P : Pointer;
begin
   I:=0;
   J:=10;
   getMem(P, 4098);  // Выделение памяти
  try
     K := J div I;
     showmessage(inttostr(k));
  finally
     FreeMem(p, 4098); //Гарантированно выполняется     
     Showmessage ('Память освобождена');
  end;
end;
В данном случае память освободится в любом случае. Независимо от исключительных ситуаций (В данном случае - деление на ноль)

 

В блоке finally не обрабатываются исключительные ситуации - они могут быть обработаны только в блоке except. Операторы блока finally гарантированно выполняются независимо от того, что произошло в предыдущем блоке try.

Вложенные блоки try-except и try-finally

Схема создания смешанных блоков защищенных операторов и защищенных ресурсов:

{Выделение ресурса}
try
    try
      {операторы, которые могут вызвать ошибку(сгенерировать исключение)}
    except
      {Операторы обработки исключений}
    end;
finally
   {Освобождение реурса}
end;
Обработка определенных исключений

 Пример:

  try
    {операция печати}
  finally
    on E: Eprinter do
       Showmessage(E.Message); //Вывести сообщение об ошибке
  end;
В данном случае отлавливается именно ошибка при печати (EPrinter).

Классы исключений:

 

Delphisource (2006г.)
Используются технологии uCoz