Шаг 80.
Принудительное возбуждение исключительных ситуаций

    На этом шаге мы рассмотрим программное возбуждение исключительных ситуаций.

    Дополнительные возможности обработки исключений в языке Object Pascal предоставляются зарезервированным словом raise, которое предназначено для принудительного возбуждения исключительной ситуации. По синтаксису после raise может быть указан вызов конструктора, который создает объект, принадлежащий к классу исключений, в результате чего возникнет исключительная ситуация, описываемая этим объектом. Причем этот объект может принадлежать как к одному из стандартных классов обработки исключений модуля SysUtils, так и к описанному пользователем классу, являющемуся потомком класса Exception или его наследников.

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

try
    СписокОператоров1 
except
  on Исключение1   do 
  begin
    Операторы предварительной  обработки
    raise;   {   Вызов  стандартного  обработчика Исключения1   } 
  end; 
end;

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

type
  EMyException = class(Exception)

    Для возбуждения исключительной ситуации класса EMyException достаточно выполнить вызов:

  raise EMyException.Create('Сообщение моего исключения');

    Если требуется обеспечить доступ к свойствам (например Message) и методам конкретного объекта исключительной ситуации, то при описании блока обработки исключения перед идентификатором класса исключения (например EMyException) ставится пользовательский идентификатор (например MyExptId), обозначающий объект этого класса:

  on MyExptId : EMyException do 
  begin
    MyExptId.Message := 'Сообщение моего исключения';
    .    .    .    .    .
  end;

    В заключение рассмотрения оператора try, приведем описание базового класса Exception и иерархию его классов-потомков, предназначенных для обработки исключительных ситуаций:

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); 
  constructor CreateResFmt(Ident: Integer; const Args: array of const); 
  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); 
  constructor CreateResFmtHelp(Ident: Integer; 
        const Args array of const; AHelpContext: Integer); 
  property HelpContext: Integer read FHelpContext write FHelpContext;
  property Message: string read FMessage write FMessage; 
end; 
  ExceptClass = class of Exception;


Рис.1. Иерерхия классов-наследников

    Со следующего шага мы начнем знакомиться с управляющими процедурами.




Предыдущий шаг Содержание Следующий шаг