【发布时间】:2019-10-04 19:45:19
【问题描述】:
我观察到在这两种情况下,这两个块下的语句将执行相同的操作。我不明白有什么区别。请你解释一下。
【问题讨论】:
-
你能给我们看看code吗?
标签: openedge progress-4gl
我观察到在这两种情况下,这两个块下的语句将执行相同的操作。我不明白有什么区别。请你解释一下。
【问题讨论】:
标签: openedge progress-4gl
毫不奇怪ON ERROR 与错误处理有关。您应该阅读在线帮助/手册中的相关内容,因为有很多方法可以解决问题。
DO 基本上只是一个块。没有其他任何东西,它真的不会做很多事情。与TRANSACTION 或ON 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.
【讨论】:
ON ERROR 语句让您可以控制块失败时发生的情况。例如,如果您使用 ROUTINE-LEVEL 错误处理,默认情况下不会捕获块级别的错误,因此您可以
DO ON ERROR UNDO,THROW:
END.
这将确保错误被捕获。如果您使用 BLOCK-LEVEL 错误处理,则默认情况下会被捕获。
这只是一个示例,您可以将 ON ERROR 用于许多事情。看看这个文档:https://help.consultingwerkcloud.com/openedge/117/rfi1424919692411.html
【讨论】: