На этом шаге мы рассмотрим программное возбуждение исключительных ситуаций.
Дополнительные возможности обработки исключений в языке 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. Иерерхия классов-наследников
Со следующего шага мы начнем знакомиться с управляющими процедурами.