【问题标题】:How can I catch the fact that a procedure is missing?我如何才能发现缺少程序的事实?
【发布时间】:2021-02-12 13:05:57
【问题描述】:

我正在使用 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.&lt;xxx&gt;Error 条目表示我已尝试过以下情况:

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

这些似乎都不起作用(代码已编译,但没有发现问题)。

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

【问题讨论】:

    标签: exception openedge progress-4gl


    【解决方案1】:

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

    在 OE11.6 中,您需要以“传统”方式处理 STOP 条件。使用此示例,您可以将 STOP 条件“转换”为错误,可以从下一个 blck 开始捕获。

    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 指令。

    【讨论】:

    • 非常感谢。我们快要到了。您知道我如何显示消息,提及调用堆栈和更多信息吗? (或者这不可能因为STOP-clause?)
    • STOP 方法不可能。
    • @nwahmaet:我已经担心了:MESSAGE 表示您要求应用程序显示消息,而STOP 表示应用程序已停止,您不能要求停止申请做某事。 :-) 对吗?
    • 您可以从捕获的 Stop 异常中获取 aCallStack,但当您使用 Mike 提到的 DO ON STOP 方法时则不行。
    【解决方案2】:

    如果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 条件的侵入性较小,而且可能范围更广。

    【讨论】:

      猜你喜欢
      • 2015-07-30
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 2018-12-25
      相关资源
      最近更新 更多