Собственная обработка ошибок
Опция NO-ERROR перенаправляет ошибки в системный указатель (handle) ERROR-STATUS. В нем сохраняются все сообщения об ошибках, вызванные оператором с опцией NO-ERROR. Эта информация сохраняется до тех пор, пока не будет выполнен другой оператор с опцией NO-ERROR, независимо от его результата.
ERROR-STATUS позволяет проверить, произошла ли вообще какая-нибудь ошибка или произошла ли конкретная ошибка. Для проверок предоставляются соответствующие атрибуты и методы. Важнейшие атрибуты и методы приведены в таблице (Таблица 7).
Таблица 7. Атрибуты и методы ERROR-STATUS
Атрибут или метод |
Описание |
Атрибут ERROR | Если ABL оператор использует опцию NO-ERROR и происходит ошибка (должно быть установлено состояние ERROR), то этот атрибут получит значение TRUE.
Если метод системного объекта ABL генерирует сообщение об ошибке, то атрибут остается в состоянии FALSE. |
Атрибут ERROR-OBJECT-DETAIL | Если метод Web сервиса возвращает SOAP ошибку, AVM сохраняет информацию о ней в объекте ABL SOAP-fault и устанавливает ERROR. AVM хранит ссылку на объект SOAP-fault в этом атрибуте. |
Атрибут NUM-MESSAGES | Предоставляет количество всех сообщений об ошибках генерируемых оператором с опцией NO-ERROR. |
Метод GET-MESSAGE(index) | Позволяет получить строку сообщения указанной ошибки. Index – это число от 1 до значения NUM-MESSAGES. |
Метод GET-NUMBER(index) | Позволяет вам получить конкретный номер ошибки. Index – это число от 1 до значения NUM-MESSAGES. |
Проверка ошибок оператора.
Следующий пример (Программа 27) предполагает, что Вы хотите выполнить специальную обработку в случае возникновения конкретной ошибки. Опция NO-ERROR подавляет стандартную обработку, и оператор IF проверяет ERROR-STATUS на наличие конкретной ошибки.
Программа 27. Проверка ошибок оператора
DEFINE VARIABLE i AS INTEGER NO-UNDO. FIND FIRST Customer WHERE CustNum = 1000 NO-ERROR. IF ERROR-STATUS:ERROR THEN DO i = 1 TO ERROR-STATUS:NUM-MESSAGES: IF ERROR-STATUS:GET-NUMBER( i ) = 565 THEN RUN FailedFindRecovery.p. IF i = ERROR-STATUS:NUM-MESSAGES THEN RUN GeneralErrorRecovery.p END.
Пример взят из документации OpenEdge – и выглядит несколько странно. Но, если предположить, что GeneralErrorRecovery.p должна выполняться всегда, даже если FailedFindRecovery.p уже была выполнена, то все в порядке. Впрочем, свою функцию примера он выполняет.
Проверка ошибок встроенных методов.
Так как встроенные методы системных объектов не устанавливают ERROR-STATUS:ERROR (но сохраняют сообщения), для проверки следует использовать:
IF ERROR-STATUS:NUM-MESSAGES > 0.
Смотри пример (Программа 28).
Программа 28. Проверка ошибок встроенных методов
DEFINE VARIABLE hSocket AS HANDLE. CREATE SOCKET hSocket. hSocket:CONNECT ("-H localhost -S 3333") NO-ERROR. IF ERROR-STATUS:NUM-MESSAGES > 0 THEN RUN FailedSocketConnect.p.
Замечание: Некоторые встроенные функции ABL также не устанавливают ERROR-STATUS:ERROR, так что предложенный здесь метод проверки следует считать более универсальным. Кроме того, единообразный способ проверки на ошибку улучшает читаемость кода.