В чем разница между Do и Do при ошибке в Progress 4gl? - PullRequest
1 голос
/ 04 октября 2019

Я заметил, что в обоих случаях операторы в этих двух блоках будут выполняться одинаково. Я не понимаю, в чем разница. Пожалуйста, вы можете объяснить.

Ответы [ 2 ]

4 голосов
/ 04 октября 2019

Не удивительно, ON ERROR имеет отношение к обработке ошибок. Вы должны прочитать об этом в интерактивной справке / руководстве, так как есть много способов, что делать.

DO - это просто блок. Без чего-либо еще это действительно мало что дает. В сочетании с такими операторами, как TRANSACTION или ON ERROR, это может сильно изменить ход вашей программы. Вам также следует проверить оператор NO-ERROR. Это также влияет на обработку ошибок.

В приведенных ниже примерах я вынуждаю ошибку, пытаясь привести строку HELLO к целому числу, это, конечно, не работает.

DO ON ERROR, RETRY

Это будет повторять блок в случае ошибки и для RETRY задано значение true. Если вы не LEAVE в RETRY -блоке, у вас будет петля.

DO ON ERROR UNDO, RETRY:

    IF RETRY THEN DO:

        DISPLAY "RETRY".

        /* Do some cleanup or what else */
        LEAVE.
    END.

    i = INTEGER("HELLO").

END.

DO ON ERROR, THROW

A возможно большесовременный подход при использовании THROW - CATCH. Обратите внимание, что это также подавляет появление ошибки (немного похоже на NO-ERROR).

DEFINE VARIABLE i AS INTEGER   NO-UNDO.

DO ON ERROR UNDO, THROW:

    i = INTEGER("HELLO").

END.

CATCH error AS Progress.Lang.Error :

    MESSAGE "We had an error".

END CATCH.

DO:

Программа просто остановится при ошибке

DEFINE VARIABLE i AS INTEGER   NO-UNDO.

DO:

    i = INTEGER("HELLO").

END.
1 голос
/ 04 октября 2019

Оператор ON ERROR дает вам контроль над тем, что происходит в случае сбоя блока. Например, если вы используете обработку ошибок ROUTINE-LEVEL, ошибки на уровне блоков по умолчанию не перехватываются, поэтому вы можете

DO ON ERROR UNDO,THROW:
END.

. Это обеспечит фиксацию ошибки. Если вы используете обработку ошибок BLOCK-LEVEL, то это будет по умолчанию.

Это всего лишь пример, и есть много вещей, для которых вы можете использовать ON ERROR. Посмотрите на эту документацию: https://help.consultingwerkcloud.com/openedge/117/rfi1424919692411.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...