我怎样才能发现程序丢失的事实?

How can I catch the fact that a procedure is missing?

我正在使用 Progress-4GL 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 条目意味着我已经尝试了以下情况:

None 似乎有效(编译了代码,但没有发现问题)。

有人知道如何解决这类问题吗?

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

在 OE11.6 中,您需要以“传统”方式处理 STOP 条件。使用此示例,您可以将 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 程序中,Procedure Setting 对话框为 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.

这些方法需要开发人员将代码添加到每个 运行 语句,而捕获 STOP 条件的侵入性较小,而且范围可能更广。