Генерация ошибок 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. |