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

Генерация ошибок VFP

« Назад

Команда

ERROR nErrorNumber | nErrorNumber, cMessageText1 | [cMessageText2]

генерирует ошибку VFP.

Параметры:

nErrorNumber – задает номер ошибки, подлежащей генерации.

cMessageText1 – текст дополнительного сообщения, выводимый вместе с сообщением об ошибке.

cMessageText2 – текст, выводимый в окне сообщений об ошибке.

Когда параметр cMessageText2 задан вместо параметра nErrorNumber, VFP генерирует ошибку, заданную пользователем (ее номер 1098).

Команда ERROR употребляется при проверке создаваемых пользователем процедур, обрабатывающих ошибки, и для генерации добавляемых пользователем сообщений об ошибках.

При задании неверного значения nErrorNumber возникнет ошибка с номером 1941.

Пример. Печатаются все ошибки VFP, имеющие код от 1 до 100.

clear

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

for errNumber = 1 to 100

&& Используем выражение с именем

error (errNumber)

endFor

on error

procedure ErrorHandler(errCode, errMessage)

set alternate to d:\a.txt additive

set alternate on

set console on

&& Вывод выполняем, если задан существующий в VFP номер ошибки errNumber

if errCode <> 1941

    ? 'Ошибка VFP № ' + Transform(errCode) + '. ' + errMessage

endif

close alternate

endProc

Первые 10 сообщений, сгенерированных процедурой ErrorHandler:

Ошибка VFP № 1. File does not exist.

Ошибка VFP № 3. File is in use.

Ошибка VFP № 4. End of file encountered.

Ошибка VFP № 5. Record is out of range.

Ошибка VFP № 6. Too many files open.

Ошибка VFP № 7. File already exists.

Ошибка VFP № 9. Data type mismatch.

Ошибка VFP № 10. Syntax error.

Ошибка VFP № 11. Function argument value, type, or count is invalid.

Ошибка VFP № 12. Variable is not found.

Ошибку можно вызвать и употребив команду THROW, которая, если не имеется обрабатывающего THROW-исключение CATCH-оператора TRY-конструкции, прекращает выполнение программы. Команда THROW создает объект-исключение (также он создается в TRY-блоке рассмотренной выше конструкции TRY ... CATCH ... FINALLY).

Если THROW-исключение создано вне TRY-конструкции, то оно передается другому пользовательскому или стандартному обработчику ошибок VFP. Так, в приводимом ниже коде, во-первых, обработчик ErrorHandler сообщит об отсутствии TRY-конструкции (ошибка № 2059) и, во-вторых, распечатает значения параметра errMessage, содержащего описание ошибки, и значения свойств ErrorNo, Message, UserValue, Details, Procedure и LineNo объекта-исключения, созданного THROW:

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

throw 25                             && Выполнение программы будет прервано

procedure ErrorHandler

parameters errCode, errMessage

if errCode <> 1941 then

    ? 'Ошибка VFP № ' + Transform(errCode) + '. ' + errMessage

endif

endProc

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

Ошибка VFP № 2059. Unhandled Structured Exception

ErrorNo: 2071

Message: User Thrown Error

UserValue: 25

Details:

Procedure: Test

LineNo: 8

Более информативно употребление THROW с параметром класса Exception. Тогда, например, используя его событие Init, можно передать дополнительные характеризующие ошибку сведения, например:

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

throw CreateObject("ThrowException")   && Выполнение программы будет прервано

procedure ErrorHandler

endProc

define class ThrowException as Exception

procedure Init

? "Время возникновения ошибки: " + Ttoc(DateTime( ))

endProc

endDefine

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

Время возникновения ошибки: 12/18/05 12:15:28 PM

Ошибка VFP № 2059. Unhandled Structured Exception.

ErrorNo: 2071

Свойство UserValue созданного THROW объекта-исключения, будет содержать ссылку на этот объект.

Если команда THROW вызвана в методе и не находится внутри TRY-конструкции, то сгенерированное ею исключение будет обработано процедурой Error этого метода, если таковая существует. В противном случае будет задействован ON ERROR-обработчик или, при его отсутствии, – стандартный обработчик VFP.

При обращении к THROW вне TRY-конструкции выполнение программы прекращается. Запрещен вызов THROW в командном окне.

Замечание. Обычно команда THROW употребляется во вложенных TRY-конструкциях. Действие команды THROW, когда она расположена внутри TRY-конструкций, описано в разд. 7.5.3.

VFP поддерживает класс Exception только в PRG-файлах. Объекты-исключения не поддерживают ошибки, возникающие при работе с COM-объектами и ODBC, а также ошибки триггеров баз данных. Информацию о таких ошибках можно, однако, получить, употребив внутри TRY-конструкции функцию AERROR( ).

В тоже время значения, возвращаемые функциями ERROR( ), MESSAGE( ) и AERROR( ), если они использованы внутри TRY-конструкции, не всегда надежны. Поэтому для анализа ошибки следует употреблять объект исключение.

Замечание. См. также в справке VFP тему Exception class.