Распечатать страницу

Виды обработчиков ошибок в Microsoft Visual FoxPro

« Назад

Ошибки исполнения можно обрабатывать:

  • стандартным, встроенным в VFP обработчиком;

  • пользовательским обработчиком, заданным командой ON ERROR;

  • при помощи конструкции TRY ... CATCH ... FINALLY;

  • обработчиком события Error объекта.

Функция

SYS(2410)

возвращает вид обработчика (табл. 7.2), которому передается обнаруженная ошибка.

Таблица 7.2

Значения, возвращаемые функцией SYS(2410)

Значение

Вид обработчика

0

Стандартный (системный)

1

TRY...CATCH...FINALLY

2

Обработчик события Error

3

ON ERROR-обработчик

Тип возвращаемого функцией SYS(2410) результата – Character.

Замечание. Если TRY-конструкция не содержит оператора CATCH или опция WHEN lExpression имеющегося CATCH-оператора вычисляется со значением .F., то SYS(2410) может возвращать неверное значение.

Пример. Имеются 3 вида обработчиков. При вызове обработчика заполняется соответствующая строка массива errHandlerType; данные, помещенные в массив, выводятся на печать.

public errHandlerType(3, 3)

store .F. to errHandlerType

&& Имеются обработчики ON ERROR, Error и TRY

&&

on error do ErrorHandler with Error( ), Message( )

ob = NewObject("SomeClass")

x = –9.0^(2 / 3)                   && Ошибка

try

ob.SomeMethod                  && При вызове метода возникнет ошибка

x = Sqrt(–5.0)                     && Ошибка

catch to oErr

FillInErrHandlerType(Val(Sys(2410)), oErr.ErrorNo, oErr.Message)

endTry

&&

&& Определяем, какие ошибки имели место

if errHandlerType(1, 1) then

? "Ошибка обнаружена TRY-конструкцией:"

? "№ ", errHandlerType(1, 2), "; ", errHandlerType(1, 3)

endif

if errHandlerType(2, 1) then

? "Вызван обработчик события Error:"

? "№ ", errHandlerType(2, 2), "; ", errHandlerType(2, 3)

endif

if errHandlerType(3, 1) then

? "Выполнен ON ERROR-обработчик:"

? "№ ", errHandlerType(3, 2), "; ", errHandlerType(3, 3)

endif 

define class SomeClass as Custom

procedure SomeMethod

    x = 1 + "A"                               && Ошибка: смешение типов данных

endProc

&&

&& Обработчик события Error

procedure Error(nError, cMethod, nLine)

FillInErrHandlerType(Val(Sys(2410)), nError, cMethod)

endProc

endDefine

&& ON ERROR-обработчик

procedure ErrorHandler(errCode, errMessage)

                                            FillInErrHandlerType(Val(Sys(2410)), errCode, errMessage)

endProc

&& Формирует строку массива errHandlerType

procedure FillInErrHandlerType(iErrType, errorNo, erMessage)

errHandlerType(iErrType, 1) = .T.

errHandlerType(iErrType, 2) = errorNo

errHandlerType(iErrType, 3) = erMessage

endProc

Сообщения программы:

Ошибка обнаружена TRY-конструкцией:

№  61; SQRT( ) argument cannot be negative

Вызван обработчик события Error:

№ 107; SomeMethod

Выполнен ON ERROR-обработчик:

№  78; ** or ^ domain error