【发布时间】:2014-04-17 08:03:08
【问题描述】:
有没有类似于php中的try catch的方法?
try {
...
}
catch (Exception $e) {
...
}
我已经使用了这种类型的块:DO ON ERROR UNDO ...,但我想知道是否还有其他方法。
谢谢。
【问题讨论】:
标签: progress-4gl
有没有类似于php中的try catch的方法?
try {
...
}
catch (Exception $e) {
...
}
我已经使用了这种类型的块:DO ON ERROR UNDO ...,但我想知道是否还有其他方法。
谢谢。
【问题讨论】:
标签: progress-4gl
是的。从 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.
像您的示例一样带有错误执行的旧样式程序,取自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.
BLOCK-LEVEL ON ERROR UNDO, THROW 的完整描述
来自手册:
ERROR UNDO, THROW 上的语法块级。
此语句影响以下块类型:
外部过程的主块 (.p)
内部程序
用户自定义函数
类的方法
类构造函数
属性访问器
ON 块用作数据库触发器,具有 CREATE、DELETE、WRITE 或 分配事件
重复块
FOR 块
DO TRANSACTION 块
此声明不影响:
析构函数在单独的非例程级块中显式编码的错误指令
作为 UI 触发器的 ON 块。
注意这些替代 BLOCK-LEVEL ON ERROR UNDO, THROW 声明:
您无需将语句添加到源代码文件中,而是 可以使用 -undothrow 2 启动参数来改变默认值 对 UNDO 的错误处理,THROW 对受 编译期间的 BLOCK-LEVEL 语句。请参阅启动命令和 参数参考了解更多信息。可以使用 ROUTINE-LEVEL ON ERROR UNDO, THROW 语句,如果您 只想在例程级别更改默认错误处理 块。 (您可以使用 -undothrow 1 启动参数来更改 例程级别块上的默认错误处理为 UNDO,THROW 期间 编译。)
【讨论】:
BLOCK-LEVEL。但我把这个答案留到以后。非常感谢你。 :)
THROW 和 CATCH 也无法识别。 :(