【问题标题】:What is the difference between Do and Do on error in Progress 4gl?在 Progress 4gl 中执行和执行错误有什么区别?
【发布时间】:2019-10-04 19:45:19
【问题描述】:

我观察到在这两种情况下,这两个块下的语句将执行相同的操作。我不明白有什么区别。请你解释一下。

【问题讨论】:

  • 你能给我们看看code吗?

标签: openedge progress-4gl


【解决方案1】:

毫不奇怪ON ERROR 与错误处理有关。您应该阅读在线帮助/手册中的相关内容,因为有很多方法可以解决问题。

DO 基本上只是一个块。没有其他任何东西,它真的不会做很多事情。与TRANSACTIONON ERROR 之类的语句搭配使用,可以极大地改变程序的执行方式。您还应该查看NO-ERROR 声明。它还会影响错误处理。

在下面的示例中,我通过尝试将字符串 HELLO 强制转换为整数来强制出错,这当然行不通。

执行错误,重试

如果出现错误并将RETRY 设置为true,这将重复该块。如果你不在RETRY-block 中LEAVE,你就会有一个循环。

DO ON ERROR UNDO, RETRY:

    IF RETRY THEN DO:

        DISPLAY "RETRY".

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

    i = INTEGER("HELLO").

END.

出错,抛出

当使用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.

做:

程序会在出错时停止

DEFINE VARIABLE i AS INTEGER   NO-UNDO.

DO:

    i = INTEGER("HELLO").

END.

【讨论】:

    【解决方案2】:

    ON ERROR 语句让您可以控制块失败时发生的情况。例如,如果您使用 ROUTINE-LEVEL 错误处理,默认情况下不会捕获块级别的错误,因此您可以

    DO ON ERROR UNDO,THROW:
    END.
    

    这将确保错误被​​捕获。如果您使用 BLOCK-LEVEL 错误处理,则默认情况下会被捕获。

    这只是一个示例,您可以将 ON ERROR 用于许多事情。看看这个文档:https://help.consultingwerkcloud.com/openedge/117/rfi1424919692411.html

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 2016-12-02
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多