|
Обработка условий STOP и QUIT
Обработка условия STOP
Условие STOP происходит, когда выполняется оператор STOP. AVM также способен автоматически поднимать условие STOP, когда происходит неисправимая системная ошибка; например, когда соединение с базой данных теряется, или оператор RUN не может найти файл процедуры.
Пользователь может поднять условие STOP при нажатии определенных клавиш, привязанных к обработке этого условия во время выполнения ввода (или в любое время в символьном интерфейсе). Эти клавиши обычно соответствует следующим комбинациям:
- CTRL-BREAK (Windows)
- CTRL-C (UNIX)
Обработка, заданная по умолчанию
Когда происходит условие STOP, по умолчанию AVM пошагово выполняет следующие действия:
- Если причина возникновения условия STOP это неисправимая системная ошибка, как в случае с оператором RUN, который не смог найти файл процедуры, то AVM на экран монитора выведет сообщение об ошибке. При этом опция NO-ERROR не подавляет сообщения об ошибках, которые возникают из условия STOP.
- AVM отменяет текущую транзакцию.
- AVM ищет фразу ON STOP.
- Если приложение было запущено из инструментального средства, такого как OpenEdge Editor, то оно возвращает управление в это инструментальное средство. Иначе, если вы для запуска ABL сеанса использовали параметр запуска Startup Procedure (-p), и если процедура запуска является все еще активной, то AVM перезапустит процедуру запуска.
Специальная обработка потерянных соединений с базой данных
Если OpenEdge теряет соединение с базой данных (например, потому что произошел сбой удаленного сервера), то клиентская обработка может продолжать выполняться. В этом случае, AVM:
- Поднимает условие STOP. Для этого специального экземпляра класса условия STOP вы не можете изменить заданную по умолчанию обработку. Любые фразы ON STOP будут игнорироваться.
- Удаляет любые персистент - процедуры, которые связаны с разъединенной базой данных.
- Отменяет блоки, начинающиеся с самого внутреннего активного блока в направлении наружу. Отмена блоков продолжается, пока не будет достигнут уровень выше всех ссылок на таблицы или секвенции в потерянной базе данных.
- Переключается к нормальному условию STOP. В этом пункте начнут использоваться дальнейшие фразы ON STOP, которые вы закодировали.
- Продолжит отмену блоков, пока не достигнет фразы ON STOP. Если фраза ON STOP не достигается, то выполняется отмена всех активных блоков и перезапуск процедуры верхнего уровня.
Подъем условия STOP
Оператор STOP позволяет вам поднимать условие STOP. Оператор выполняет заданную по умолчанию обработку этого условия. Если вы не закодировали фразу ON STOP, оператор STOP останавливает все, в настоящее время, активные процедуры. Синтаксис оператора следующий: STOP Отмена обработки, заданной по умолчанию
Обработка по умолчанию условия STOP почти во всех ситуациях является подходящей. Однако, вы можете отменить обработку по умолчанию при добавлении фразы ON STOP к операторам REPEAT, FOR, или DO. Ниже пример демонстрирует использование фразы ON STOP: DO ON STOP UNDO, RETRY: IF RETRY THEN DO: DISPLAY "Приложение столкнулось с условием STOP и будет завершено". UNDO, LEAVE. END. ELSE RUN MissingCode.p. END. DISPLAY "Работа приложения продолжается...". /* Эта строка ни когда не выполнится. */
В этом примере фраза ON STOP использует опцию перехода RETRY, чтобы обеспечить возможность восстановления из условия STOP. Функция RETRY в операторе IF позволяет вам определить, находитесь ли вы в режиме RETRY или нет.
Этот пример, чтобы отобразить другое сообщение об ошибках, использует в операторе перехода IF условие RETRY = TRUE. Такая безопасная структура могла бы использоваться, чтобы позволить прикладному пользователю определить местонахождение недостающего файла или запросить его о том, нужно ли сохранить данные перед завершением. Итоговый синтаксис для фразы ON STOP следующий: ON STOP UNDO [ label1 ] [ , LEAVE [ label2 ] | , NEXT [ label2 ] | , RETRY [ label1 ] | , RETURN [ return-value | ERROR [ return-value | error-object-expression ] | NO-APPLY ] ]
Где,
label1, это имя блока, обработку которого вы хотите отменить. Если вы не укажите блок label1, ON STOP UNDO отменит обработку блока, запущенного оператором, который содержит фразу ON STOP.
LEAVE [label2], Указывает, что после отмены обработки блока, AVM перейдет к блоку маркированному как label2. Если вы не укажете блок, AVM перейдет к блоку label1.
NEXT [label2], Указывает, что после отмены обработки блока, AVM выполняет следующую итерацию блока, который вы назвали label2. Если вы не укажите блок с опцией NEXT, AVM выполнит следующую итерацию блока, помеченного как label1.
RETRY [label1], Указывает, что после отмены обработки блока, AVM повторит ту же самую итерацию блока, который вы назвали label1. Если вы не указали LEAVE, NEXT, RETRY, или RETURN, то по умолчанию будет выполняться RETRY.
RETURN..., Возвращение к вызывающей подпрограмме, или если нет никакой вызывающей подпрограммы, то возвращение в OpenEdge Editor. Следующая таблица описывает различные случаи RETURN:
Опция |
Описание |
return-value |
Строка
символов (CHARACTER),
которую вы указываете для передачи в вызывающую программу.
Вызывающая программа может использовать функцию RETURN-VALUE,
чтобы считать возвращенное значение. Для пользовательских функций
значение должно соответствовать указанному возвращаемому типу. |
ERROR |
Поднимает ERROR в
вызывающей программе и отменяет текущую субтранзакцию.
Вы не можете определить
ERROR в пределах пользовательского интерфейса триггерного
блока или деструктора. |
ERROR
return-value |
Поднимает ERROR в
вызывающей программе и отменяет текущую субтранзакцию
(за исключением пользовательских функций). Символьная строка,
которую вы передаете, будет доступна в вызывающей программе с
помощью функции RETURN-VALUE.
В структурной обработке
ошибок AVM также создает объект AppError
и сохраняет возвращаемое значение в
свойстве ReturnValue. |
ERROR error-object-expression |
В структурной обработке
ошибок, поднимает ERROR в вызывающей программе и отменяет текущую
субтранзакцию.
Указанный
error-object-expression это ваш код.
Если это объект
AppError,
вызывающая программа может также использовать функцию RETURN-VALUE
для того, чтобы считать свойство ReturnValue. |
NO-APPLY |
В пользовательском
интерфейсе триггера,
препятствует тому, чтобы AVM выполнил заданное по умолчанию
поведение для этого события. |
Обработка условия QUIT
Для того чтобы полностью завершить работу приложения, в ABL есть оператор QUIT. AVM поднимает условие QUIT только, когда он сталкивается с оператором QUIT. Заданная по умолчанию обработка
Если происходит условие QUIT, то, по умолчанию, AVM выполняет следующие шаги:
- Фиксирует текущую транзакцию;
- Выходит из сеанса ABL. Если ABL сессия работает на AppServer, завершает ее, заставляя AppServer завершить работу. Затем AVM возвращается к клиентской сессии ABL, из которой он был порожден;
- Если приложение было запущено из Procedure Editor или из OE Architect, то AVM перейдет в это инструментальное средство; иначе он вернется в операционную систему.
Примечание: Даже если использовалась опция запуска –p (чтобы определить главную процедуру вашего приложения), AVM всё равно вернется в операционную систему. Подъем условия QUIT
Оператор QUIT поднимает условие QUIT и направляет содержащий его блок, для выполнения заданной по умолчанию обработки этого условия. Синтаксис оператора следующий: QUIT Отмена заданной по умолчанию обработки
Заданная по умолчанию обработка условия QUIT почти всегда является подходящей. Однако, при использовании фразы ON QUIT в блоках REPEAT, FOR EACH, или DO, вы можете изменить заданную по умолчанию обработку.
Следующий пример использует фразу ON QUIT, чтобы выполнить переход в пределах блока, чтобы выполнить определенное действие перед завершением работы приложения: DO ON QUIT UNDO, RETRY: IF RETRY THEN DO: DISPLAY "Приложение столкнулось с условием QUIT и будет завершено.". UNDO, LEAVE. END. FIND FIRST customer WHERE CustNum = 1000 NO-ERROR. IF ERROR-STATUS:ERROR THEN QUIT. END. |