Процедуры, возбуждающие исключения в Delphi
Возбуждение исключений
При создании приложений часто приходится проектировать блоки кода, которые могли бы возбуждать исключения. В Delphi для этих целей предусмотрены оператор Raise и несколько специальных процедур.
Оператор Raise
Для возбуждения исключений обычно используется оператор Raise. Синтаксис его использования следующий:
Raise [<объект>] [At <адрес>]
Возможны следующие варианты использования оператора Raise:
а) Для повторного возбуждения (reraising) текущего исключения.
Внутри нескольких вложенных обработчиков Raise захватывает конкретный экземпляр исключения и передает его вверх первой встречной конструкции Try. Если такой конструкцией будет Try..Finally, то выполняться операторы раздела Finally. Если это конструкция Try..Except, то исключение будет помечено, как обрабатываемое и начнется выполнение операторов раздела Except. Чаще всего оператор Raise без параметров включают внутрь раздела Try..Except.
Если других уровней обработки исключения нет, то оно будет перехвачено имеющимся в Delphi обработчиком по умолчанию, который выведет соответствующее сообщение и уничтожит объект исключения.
б) Для возбуждения исключения, включая собственные. Если создаются собственные компоненты, то может возникнуть необходимость в создании специальных исключений, которые могут возбуждаться, например, при присвоении недопустимого значению свойству компонента. Для этого необходимо, как минимум, объявить класс исключения. Когда код в компоненте должен возбудить исключение необходимо создать представителя этого класса.
Raise возбуждает исключительную ситуацию, создавая экземпляр исключения. Обычно эту операцию выполняют по условию If..Then Raise … В этом заключается второе назначение Raise — инициировать различные ситуации, включая пользовательские. Класс исключения может быть и уже известным. Очистка ошибки также выполняется.
If Length(Editl.Text)=O Then Raise Exception.Create(‘He указана длина строки!’);
Процедуры, возбуждающие исключения
а) Для возбуждения исключений, связанных с отсутствием оперативной памяти предусмотрена следующая процедура:
OutOfMemoryError; — Возбуждает исключение класса EOutOfMemory.
Использовать процедуру OutOfMemoryError для возбуждения исключения гораздо проще, чем базовое исключение Exception. Так стандартное возбуждение исключения с помощью базового исключения должно выглядеть примерно так:
Raise Exception.Create(‘Out of memory.’);
Для возбуждения исключения с помощью процедуры OutOfMemoryError и вывода аналогичного сообщения достаточно записать:
OutOfMemoryError;
б) Для повторного возбуждения исключений, связанных с ошибками функций Win32 API можно использовать следующую процедуру.
RaiseLastWin32Error — Возбуждает заново исключение EWin32Error.
Возбуждение исключений в базах данных
Для возбуждения исключительных ситуаций класса EDatabaseError может использоваться несколько следующих процедур:
DatabaseError(Const Message: String; Component: TComponent=Nil);
Возбуждает исключение класса EDatabaseError, передавая сообщение с помощью параметра Message. Второй параметр позволяет уточнить источник ошибки.
Использовать процедуру DatabaseError для возбуждения исключения гораздо проще, чем базовое исключение Exception. Так стандартное возбуждение исключения с помощью базового исключения должно выглядеть примерно так:
Raise Exception.Create(‘ошибка!’);
Для возбуждения исключения с помощью процедуры DatabaseError достаточно записать:
DatabaseError(‘ ошибка!’);
DBError(Ident: Word);
Возбуждает исключение класса EDatabaseError, передавая сообщение из строкового ресурса с номером Ident.
DBErrorFmt(Ident: Word; Const Args: Array Of Const);
Возбуждает исключение класса EDatabaseError, передавая сообщение из строкового ресурса с номером Ident, которое может быть отформатировано с помощью констант Args.
Для возбуждения исключительных ситуаций класса EDBEngineError может использоваться несколько следующих процедур:
DBIError(ErrorCode: DBIResult);
Возбуждает исключение класса EDBEngineError для BDE, с передаваемым номером кода ошибки ErrorCode.
Воспользоваться вышеприведенными процедурами для возбуждения исключительных ситуаций можно при прямых вызовах BDE, при попытках динамического создания объектов базы данных с помощью соответствующих команд SQL и т.п.