17.1 Оператор Raise

На верх  Назад  Вперёд

Оператор Raise выглядит следующим образом:


Оператор Raise

1701


Этот оператор вызывает исключение. Если он используется, экземпляр исключения должен быть инициализирован как экземпляр любого класса, который является типом допустимым Raise. Адрес исключения и адрес области можно опустить. Если они не указаны, компилятор сообщит адрес сам по себе. Если экземпляр исключения опущен, то текущее исключение будет вновь инициировано. Эта конструкция может быть использована только в блоке обработки исключений (см 17.2 Операторы try...except).

Примечание:

После обработки исключения, управление не возвращается в точку, вызвавшую исключение. Управление передаются сразу-же, если очередной оператор блока try...finally или try...except (в блоке try) и не возвращается, обработка исключения разрушает стэк. Если такой оператор не найден (оператор try...except), будет сгенерирована ошибка библиотеки времени выполнения Free Pascal - 217 (см также раздел 17.5 Классы исключений) . Процедура обработки исключения выводит адрес обрабатываемого исключения.

Как пример: Приведена функция деления, если знаменатель равен нулю, то инициируется исключение EDivException

Type EDivException = Class(Exception);

Function DoDiv (X,Y : Longint) : Integer;

begin

If Y=0 then

  Raise EDivException.Create ('Произойдёт деление на ноль');

Result := X Div Y;

end;

В модуле Sysutils библиотеки RTL определены Классы исключений (Exception). (раздел 17.5 Классы исключений)

Примечание:

Хотя класс Exception используется в качестве базового класса для исключений по всему коду, это всего лишь негласное соглашение: класс может быть любого типа, и не должен быть потомком класса Exception.

Конечно, большая часть кода использует неписаное соглашение и класс исключения происходит от Exception.

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

{$mode objfpc}

uses sysutils;

 

procedure error(Const msg : string);

begin

raise exception.create(Msg) at

  get_caller_addr(get_frame),

  get_caller_frame(get_frame);

end;

 

procedure test2;

begin

error('Error');

end;

 

begin

test2;

end.

Программа, при запуске, покажет следущее:

An unhandled exception occurred at $00000000004015DD :
Exception : Error
 $00000000004015DD line 15 of testme.pas
 $00000000004015ED line 19 of testme.pas

Произошло необработанное исключение в $00000000004015DD :
Искличение : Ошибка
 $00000000004015DD в строке 15 в файле testme.pas
 $00000000004015ED в строке 19 в файле testme.pas

Сообщение об Ошибке

или

Сообщение об Ошибке

Строка 15 находится в процедуре Test2, а не Error, которая на самом деле вызвала исключение.