微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决我怎样才能发现程序丢失的事实?

我正在使用 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,其中可以在 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 指令。

,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。