我如何捕捉过程丢失的事实?



我正在使用Progress-4GL Release 11.6,使用appBuilder和程序编辑器。

我刚刚忘记写一个过程,导致我的应用程序"崩溃"了;(至少,看起来是这样的)。显然,当我的应用程序"崩溃"时,我不知道它是由丢失的过程引起的,所以我开始尝试异常处理,结果如下:

正在运行:

SESSION:ERROR-STACK-TRACE = TRUE. // in order to see the callstack
DO ON ERROR UNDO, THROW:
MESSAGE "This is nonsense: [" INT("blabla") "]" VIEW-AS ALERT-BOX.
CATCH eAnyError AS Progress.Lang.Error:
MESSAGE
"Error Number:~t" eAnyError:GetMessageNum(1) "~n"
"Error Text:~t" eAnyError:GetMessage(1) "~n"
"Callstack:~~t" eAnyError:CallStack
VIEW-AS ALERT-BOX BUTTONS OK TITLE "Error processing in the CATCH-clause".
END CATCH.
END.

这意味着:执行错误转换的情况(典型的编程问题),捕获异常并在屏幕上显示相应的信息。

然而,这个似乎不起作用:

DO ON ERROR UNDO, THROW:
RUN I-do-not-exist.
CATCH eAnyAppError AS Progress.Lang.<xxx>Error:
MESSAGE
"Error Number:~t" eAny<xxx>Error:GetMessageNum(1) "~n"
"Error Text:~t"   eAny<xxx>Error:GetMessage(1) "~n"
"Callstack:~~t"   eAny<xxx>Error:CallStack
VIEW-AS ALERT-BOX BUTTONS OK TITLE "Error processing in the next CATCH-clause".
END CATCH.
END.

供您参考,Progress.Lang.<xxx>Error条目意味着我已经尝试了以下情况:

  • Progress.Lang.Error
  • Progress.Lang.ProError
  • Progress.Lang.AppError

这些似乎都不起作用(代码编译了,但没有捕捉到问题)。

有谁知道如何捕捉这种问题吗?

简单的答案是升级到OpenEdge 12,其中STOP条件可以在CATCH块中捕获:)(最新的OpenEdge 11.7服务包也可以作为技术预览版使用)。

在OE11.6中,您需要处理"传统的";道路使用这个示例,您可以"转换"将STOP条件转换为错误,可以从下一个块开始捕获。

DO ON ERROR UNDO, THROW
ON STOP UNDO, RETURN ERROR NEW Progress.Lang.AppError ("A Stop Condition has occurred", 0).
当你在一个简单的块上使用DO ON ERROR UNDO, THROW时,可能值得指出的是,你可以使用 将THROW设置为编译单元中任何块的默认值
BLOCK-LEVEL ON ERROR UNDO, THROW . 

指令放在程序的顶部。在AppBuilder程序中,过程设置对话框为USING语句提供了一个子对话框——你也可以在这里添加BLOCK-LEVEL指令。

如果I-do-not-exist是一个外部过程,那么您可以添加保护。

if not search('I-do-not-exist') eq ? then
run I-do-not-exist.

你可以创建一个包含文件为你做这些

//run.i &prog
if not search('{&prog}') eq ? then
run {&prog}.

您还可以使用INTERNAL-ENTRIES属性检查内部过程。像下面这样的

if lookup('I-do-not-exist', this-procedure:internal-entries) gt 0 then
run I-do-not-exist.

这些方法的缺点是需要开发人员在每个RUN语句中添加代码,而捕捉STOP条件的干扰较小,并且可能范围更广。

相关内容

  • 没有找到相关文章

最新更新