Главная » Delphi » Классы исключений

0

Исключения (exceptions) представляют собой  экземпляры специальных объектов. Они создаются при передаче исключения и уничтожаются после  обработки. Базовым классом  для всех  исключений является класс Exception, определяемый следующим образом:

type

Exception = class(TObject)

private

FMessage: string;

FHelpContext: Integer;public

constructor Create(const Msg: string);

constructor CreateFmt(const Msg: string;

const Args: array of const);

constructor CreateRes(Ident: Integer); overload;

constructor CreateRes(ResStringRec: PResStringRec); overload;

constructor CreateResFmt(Ident: Integer;

const Args: array of const);

overload;

constructor CreateResFmt(ResStringRec: PResStringRec;

const Args: array of const); overload;

constructor CreateHelp(const Msg: string;

AHelpContext: Integer);

constructor CreateFmtHelp(const Msg: string;

const Args: array of const;

AHelpContext: Integer);

constructor CreateResHelp(Ident: Integer;

AHelpContext: Integer); overload;

constructor CreateResHelp(ResStringRec: PResStringRec;

AHelpContext: Integer); overload;

constructor CreateResFmtHelp(ResStringRec: PResStringRec;

const Args: array of const;

AHelpContext: Integer); overload;

constructor CreateResFmtHelp(Ident: Integer;

const Args: array of const;

AHelpContext: Integer); overload;

property HelpContext: Integer read FHelpContext

write FHelpContext;

property Message: string read FMessage write FMessage;

end;

Важным элементом объекта Exception является свойство Message, имеющее стро ковый  тип.  Оно  содержит дополнительную информацию  или  разъяснение сути  про изошедшей ошибки. Вид информации в свойстве Message зависит от типа возникшего исключения.

CОВЕТ

При определении собственного класса исключения обязательно объявляйте его как производный от уже существующего класса исключения. Это может быть класс Ex- ception или любой его потомок. Суть такого требования заключается в том, что в данном случае новый объект исключения гарантированно будет перехвачен стандарт- ным обработчиком исключений.

При  обработке конкретного типа  исключения в блоке  except его обработчик бу дет перехватывать также  и все его  производные типы.  Например, если  исключение EMathError является базовым  для  нескольких типов  исключений, в том  числе  для EZeroDivide и EOverflow, то все они  будут перехвачены обработчиком для исклю чения EMathError:

try

Statementsexcept

on EMathError do      // Перехватит исключение класса EMathError и

// все производные от негоend;

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

При  обработке исключения может  потребоваться доступ к самому экземпляру объ екта  исключения —  например, чтобы  получить дополнительную информацию  о слу чившемся, содержащуюся в свойстве Message. Для этого  есть два пути: использование необязательного идентификатора в конструкции on ESomeException или  обраще ние к функции ExceptObject().

Добавив необязательный  идентификатор  в  конструкцию  on ESomeException

блока except, можно получить идентификатор текущего объекта исключения. Синтак

сис  использования необязательного идентификатора  заключается в указании  самого

идентификатора и двоеточия непосредственно перед типом исключения:

try

Something

except

on E:ESomeException do

ShowMessage(E.Message);

end;

Идентификатор (в данном  случае E) становится экземпляром текущего  исключения. Этот идентификатор всегда имеет тот же тип, что и породившее его исключение.

Кроме  того,  можно  воспользоваться функцией ExceptObject(), которая возвращает экземпляр текущего  объекта исключения. Однако  следует отметить, что типом  возвра щаемого  функцией значения всегда является класс TObject и для работы с ним потребу ется выполнить преобразование типов. Вот пример применения этой функции:

try

Something

except

on ESomeException do

ShowMessage(ESomeException(ExceptObject).Message);

end;

В отсутствии активного исключения вызов функции ExceptObject()возвращает Nil. Синтаксис  генерации  исключения  подобен  синтаксису  создания  экземпляра  объ

екта. Так, для создания пользовательского исключения типа EBadStuff используется следующий синтаксис:

Raise EBadStuff.Create(‘Описание возникшей ошибки’);

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии