17.1 Оператор Raise |
Вверх Предыдущий Следующий |
Оператор Raise выглядит следующим образом: Оператор Raise Этот оператор вызывает исключение. Если он используется, экземпляр исключения должен быть инициализирован как экземпляр любого класса, который является типом допустимым Raise. Адрес исключения и адрес области можно опустить. Если они не указаны, компилятор сообщит адрес сам по себе. Если экземпляр исключения опущен, то текущее исключение будет вновь инициировано. Эта конструкция может быть использована только в блоке обработки исключений (см 17.2 Операторы try...except).
Как пример: Приведена функция деления, если знаменатель равен нулю, то инициируется исключение 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 Классы исключений)
Следующий код показывает, как пропустить процедуру формирования отчета об ошибках стека, показанной в обработчик исключений: {$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 : Произошло необработанное исключение в $00000000004015DD : или Строка 15 находится в процедуре Test2, а не Error, которая на самом деле вызвала исключение. |