尝试抓住进展

doy*_*y44 5 progress-4gl

有没有类似于php中的try catch的方法?

try {
    ...
} 
catch (Exception $e) {
    ...
} 
Run Code Online (Sandbox Code Playgroud)

我已经使用了这种类型的块:DO ON ERROR UNDO ...但我想知道是否还有其他方法可以做到这一点.

谢谢.

Jen*_*nsd 4

是的。从版本 11.2 开始,有一条BLOCK-LEVEL ON ERROR UNDO, THROW.语句可以更改整个程序的默认行为。CATCH自版本 10.1C 以来,它已经存在了更长的时间。

/* Must be first line of program */
BLOCK-LEVEL ON ERROR UNDO, THROW.

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

i = INTEGER("Hello").

CATCH err AS Progress.Lang.Error:    
    MESSAGE "Error: " err:GetMessage(1)        
        VIEW-AS ALERT-BOX ERROR.
END.
Run Code Online (Sandbox Code Playgroud)

旧式程序在错误时执行操作,例如您的示例,取自Progress KnowledgeBase

DO ON ERROR UNDO, THROW:
  /* The following line raises error (138) which is diverted to a Progress.Lang.SysError object and thrown to the main block. */ 
  FIND Customer 1000.
END.
 
CATCH eAnyError AS Progress.Lang.Error:
  MESSAGE
      "Error Number:~t" eAnyError:GetMessageNum(1) "~n"
      "Error Text:~t" eAnyError:GetMessage(1)
      VIEW-AS ALERT-BOX BUTTONS OK TITLE "Error processing in the CATCH for mainprocedure block".
END CATCH.
Run Code Online (Sandbox Code Playgroud)

块级错误撤消、抛出的完整描述

从手册中:

语法 BLOCK-LEVEL ON ERROR UNDO, THROW。

该语句影响以下块类型:

外部过程的主块 (.p)

内部程序

用户定义函数

一个类的方法

类构造函数

属性访问器

ON 块用作具有 CREATE、DELETE、WRITE 或 ASSIGN 事件的数据库触发器

重复块

FOR 块

DO 交易区块

该语句不影响:
析构函数

在单独的非例程级块中显式编码的错误指令

ON 块是 UI 触发器。

请注意 BLOCK-LEVEL ON ERROR UNDO, THROW 语句的替代方法:
您可以使用 -undothrow 2 启动参数将默认错误处理更改为对每个受影响的块进行 UNDO、THROW,而不是将该语句添加到源代码文件中通过编译期间的 BLOCK-LEVEL 语句。有关详细信息,请参阅启动命令和参数参考。

如果您只想更改例程级块上的默认错误处理,则可以使用 ROUTINE-LEVEL ON ERROR UNDO, THROW 语句。(您可以在编译期间使用 -undothrow 1 启动参数将例程级块上的默认错误处理更改为 UNDO、THROW。)