Обработчики try-блока в виде зарегистрированной функции |
<обработчик-try-блока> = _try (<Функция>) <оператор> [<блок-обработки-исключения>] [<блок-очистки>];
Для описания обработчика необходимо создать функцию типа TTryBlockfunction:
TTryBlockfunction = function (aPhase : TExceptionPhase; const aExceptionId : TExceptionIdRec ) : TExceptionHookReturn;
TExceptionPhase - стадия обработки, для который вызывается обработчик:
ExpBeforeTry |
Перед вызовом операторов try-блока |
ExpAfterTry |
После вызова операторов try-блока, но перед _finally. Если обработчик выдал ErStop, то эта фаза игнорируется |
ExpBeforeExcept |
Перед обработкой исключения в except-блоке |
ExpAfterExcept |
После обработки исключения в except-блоке |
ExpBeforeFinally |
Перед обработкой _finally |
ExpAfterFinally |
После обработки _finally |
ExpAfterAll |
После всей обработки try-блока |
В фазах ExpBeforeExcept и ExpAfterExcept в обработчик передается идентификатор исключения aExceptionId типа TExceptionIdRec:
TExceptionIdRec = object Group : integer; { группа исключений } Id : integer; { конкретный элемент } function System : boolean; { Системное исключение, } { а не пользовательское } end;
Результатом функции является набор значений типа TExceptionHookReturn:
ErDefault |
Обработчик не влияет на работу try-блока. |
ErStop |
Прекратить работу try-блока. При использовании в ExpBeforeTry, ExpBeforeExcept и ExpAfterExcept, идет на _finally; При использовании в ExpBeforeFinally прерывает finally-блок. |
ErDoRetry |
Продолжить работу программы после исключения оператором _retry. Используется во время значения ExpBeforeExcept, ExpAfterExcept. |
Обработчик исключения необходимо зарегистрировать:
Registerfunction('MyExceptionHandler', @MyExceptionHandler, ftByte, Chr(ftByte) + Chr(ftLongInt));