Справочник функций и процедур Delphi: Try

  Навигация по первой букве:

A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z

  Навигация по категории:

Compiler directives, Directives, Keywords / Types, Variables, Constants / Functions, Procedures

Try
Ключевое слово
Начинает код, который перехватывает ошибки System unit
  
1 Try
  Statement
{Statement...}
Finally
  Statement
{Statement...}
End;

2 Try
  Statement
{Statement...}
Except
  Statement
{Statement...}
End;

3 Try
  Statement
{Statement...}
Except
  On {Name :} Exception type Do Statement
{Else Statement}
End;

Delphi Sources

Описание
Ключевое слово Try используется для отметки начала блока инструкций, которые перехватывают ошибки. Если происходит ошибка, программа не заканчивается. Вместо этого, управление передаётся или к Finally или Excep разделу.

Try используется следующими способами:

Версия 1:

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

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

Версия 2:

В этой версии, раздел Exept будет выполнен, только если предложение Try сгенерирует исключение. Это используется для принятия альтернативных действий, когда что-нибудь идет не так, как надо. Пункт except не может определить тип ошибки.

Версия 3:

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

По назначенному имени (Name) исключения, можно получить текст сообщения исключения (Name.Message) для его отображения или других использований.

Если исключение не обработано инструкциями On или Else (для 3 версии), то выполняется проверка, находимся ли мы во вложенном блоке Try. Если да, то обрабатывается пункт Except своего родительского Try.

Пункт Else не является, действительно необходимым, лучше использовать On E:Exception Do являющееся универсальной обработкой особых ситуаций, так как обеспечивает сообщение об ошибке (E.Message).

Важно: вы можете определить тип ошибки, которая произошла, при использовании универсальной обработки особых ситуаций - On E:Exception Do. E это указатель на объект исключения. E.ClassName дает тип исключения, такой как 'EDivByZero', как показано в последнем примере.

Следующий список исключений охватывает основные типы - всего имеется сотни классов исключения:

Exception Базовый класс
EAbort Аварийное завершение работы без диалогового окна
EAbstractError Абстрактная ошибка метода
AssertionFailed Утверждают неудавшийся запрос
EBitsError Булев массив ошибок
ECommonCalendarError Календарная ошибка
EDateTimeError Ошибка DateTime
EMonthCalError Ошибка месяца
EConversionError Вызывается Convert
EConvertError Ошибка конвертирования объекта
EDatabaseError Ошибка базы данных
EExternal Ошибка аппаратных средств/Windows
EAccessViolation Нарушение прав доступа
EControlC Произошло аварийной завершение работы пользователем
EExternalException Другая Внутренняя ошибка
EIntError Целочисленная ошибка
EDivByZero Деление на ноль
EIntOverflow Переполнение целого числа
ERangeError Вне диапазона значений
EMathError Ошибка с плавающей запятой
EInvalidArgument Плохое значение аргумента
EInvalidOp Несоответствующая операция
EOverflow Значение слишком большое
EUnderflow Значение слишком маленькое
EZeroDivide Деление на ноль
EStackOverflow Серьёзная проблема Delphi
EHeapException Проблемы динамической памяти
EInvalidPointer Плохой указатель памяти
EOutOfMemory Нет возможности распределить память
EInOutError Ошибка ввода/вывода
EInvalidCast Ошибка произведенная объектом
EInvalidOperation Плохая операция компонента
EMenuError Ошибка пункта меню
EOSError Ошибка операционной системы
EParserError Ошибка синтаксического анализа
EPrinter Ошибка принтера
EPropertyError Ошибка свойства класса
EPropReadOnly Недопустимое обращение к свойству
EPropWriteOnly Недопустимое обращение к свойству
EThread Ошибка потока
EVariantError Различная ошибка
Примечания
Иногда Вы хотите построить конструкцию подобно этому:

Try
  ...
Except
  ...
Finally
  ...
End;


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

Try
  Try
    ...
  Except
    ...
  End;
Finally
  ...
End;
Похожие команды
Except  Начинает предложение заманивающее в ловушку ошибки Try инструкции

Finally  Начинает безоговорочный раздел кода инструкции Try

On  Определяет обработку особых ситуаций в предложении Try Except

Raise  Поднимает исключение

 
Пример кода : Версия 1: Деление на ноль с предложением finally
var
  number, zero : Integer;
begin
  // Попытка деленя целого числа на нуль - чтобы поднять исключение
  number := -1;
  Try
    zero   := 0;
    number := 1 div zero;
    ShowMessage('number / zero = '+IntToStr(number));
  finally
    if number = -1 then
    begin
      ShowMessage('Числу не было присвоено значение - использование значения по умолчанию');
      number := 0;
    end;
  end;
end;
Числу не было присвоено значение - использование значения по умолчанию

Затем, программа заканчивается с сообщением об ошибке EDivByZero -, предложение finally не выловило ошибку.
 
Пример кода : Версия 2: Деление на ноль с простым блоком Except
var
  number, zero : Integer;
begin
  // Попытка деленя целого числа на нуль - чтобы поднять исключение
  Try
    zero   := 0;
    number := 1 div zero;
    ShowMessage('number / zero = '+IntToStr(number));
  except
    ShowMessage('Неизвестная ошибка');
  end;
end;
Неизвестная ошибка
 
Пример кода : Версия 3: Деление на ноль с предложением Except On
var
  number, zero : Integer;
begin
  // Попытка деленя целого числа на нуль - чтобы поднять исключение
  Try
    zero   := 0;
    number := 1 div zero;
    ShowMessage('number / zero = '+IntToStr(number));
  except
    on E : Exception do
      ShowMessage(E.ClassName+' поднята ошибка, с сообщением : '+E.Message);
  end;
end;
EDivByZero поднята ошибка, с сообщением : Division by zero
 


Последние добавленные на сайт исходники

DeLiKaTeS Tetris (Тетрис)

TDictionary Custom Sort

Fast Watermark Sources

3D Designer

Sik Screen Capture

Patch Maker

 

Айболит (remote control)

ListBox Drag & Drop

Доска для игры Реверси

Графические эффекты

Рисование по маске

Перетаскивание изображений

 

Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software (источник – "DelphiBasics")

Группа ВКонтакте