我怎样才能发现程序丢失的事实?
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
条目意味着我已经尝试了以下情况:
Progress.Lang.Error
Progress.Lang.ProError
Progress.Lang.AppError
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 条件的侵入性较小,而且范围可能更广。
我正在使用 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
条目意味着我已经尝试了以下情况:
Progress.Lang.Error
Progress.Lang.ProError
Progress.Lang.AppError
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 条件的侵入性较小,而且范围可能更广。