首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Progress 4GL中实现断言

在Progress 4GL中实现断言
EN

Stack Overflow用户
提问于 2009-05-01 12:45:09
回答 4查看 988关注 0票数 3

使用Progress4GL或WebSpeed实现assertions的最佳方式是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-07 10:22:09

经过深思熟虑后,这里是我对这个问题的解决方案。它的工作原理是假设开发环境propath与测试和生产环境不同,并且代码总是被重新编译以供测试或生产使用:

代码语言:javascript
复制
&IF PROPATH MATCHES '*development*' &THEN 
&SCOPED-DEFINE ASSERTION   {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} ~
{11} {12} {13} {14} {15} {16} {17} {18} {19} {20} ~
{21} {22} {23} {24} {25} {26} {27} {28} {29} {30} ~
{31} {32} {33} {34} {35} {36} {37} {38} {39} {40} ~
{41} {42} {43} {44} {45} {46} {47} {48} {49} {50} ~
{51} {52} {53} {54} {55} {56} {57} {58} {59} {60} ~
{61} {62} {63} {64} {65} {66} {67} {68} {69} {70} ~
{71} {72} {73} {74} {75} {76} {77} {78} {79} {80} 


 IF NOT ({&ASSERTION}) THEN 
     MESSAGE "Failed assertion {&ASSERTION} in" PROGRAM-NAME(1).

 IF ({&ASSERTION}) = ? THEN 
     MESSAGE "Unknown value as a result of assertion {&ASSERTION} in" 
              PROGRAM-NAME(1).

&ENDIF

该代码旨在避免任何副作用,并且在任何执行环境(图形用户界面或ChUI、WebSpeed、AppServer、批处理等)中都能很好地工作。

1)将代码保存为名为“assert”的文件(不带任何扩展名)。

2)将文件放入PROPATH指向的目录中。

3)示例用法:

代码语言:javascript
复制
{assert valid-handle(hProc)}
{assert i > 0 and i <= 100}
{assert cExtra begins ‘opt’}  /* note the single quotes */
{assert dtEnd > = dtStart}

作为一种变体,可以通过在测试和生产环境中只有一个空的包含文件来避免完全依赖propath,开发版本将变为:

代码语言:javascript
复制
&SCOPED-DEFINE ASSERTION   {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} ~
{11} {12} {13} {14} {15} {16} {17} {18} {19} {20} ~
{21} {22} {23} {24} {25} {26} {27} {28} {29} {30} ~
{31} {32} {33} {34} {35} {36} {37} {38} {39} {40} ~
{41} {42} {43} {44} {45} {46} {47} {48} {49} {50} ~
{51} {52} {53} {54} {55} {56} {57} {58} {59} {60} ~
{61} {62} {63} {64} {65} {66} {67} {68} {69} {70} ~
{71} {72} {73} {74} {75} {76} {77} {78} {79} {80} 


 IF NOT ({&ASSERTION}) THEN 
     MESSAGE "Failed assertion {&ASSERTION} in" PROGRAM-NAME(1).

 IF ({&ASSERTION}) = ? THEN 
     MESSAGE "Unknown value as a result of assertion {&ASSERTION} in" 
              PROGRAM-NAME(1).

一个额外的提示是将自动文本宏添加到您选择的编辑器中,该宏将自动展开为{assert }。

票数 4
EN

Stack Overflow用户

发布于 2009-05-05 14:27:19

因为Progress没有对断言的本机处理,但我想出的最好的方法是:

代码语言:javascript
复制
IF NOT <assertion> THEN
RUN assertionFailed.p.

assertionFailed.p可以向程序员发送电子邮件,或者记录条件,也可以优雅地退出。

票数 1
EN

Stack Overflow用户

发布于 2009-05-05 17:23:05

鉴于断言通常在最终代码中被省略,我建议采用预处理器路线。您可能会执行如下操作,将其设置为两个包含文件。在将其编译为生产环境时,请确保debugalert.i为空。你可以编辑assert.i来做任何你喜欢的事情,比如消息,停止,电子邮件等等。

要设置断言,只需遵循{assert.i &condition=}格式

/* assert.i */ {debugalert.i}

如果定义(降级) <> 0(&T),则(&T)

如果不是{&CONDITION},则执行以下操作:

代码语言:javascript
复制
MESSAGE THIS-PROCEDURE:FILENAME "ERROR...{&CONDITION}" 
    VIEW-AS ALERT-BOX.
/* add code to email message etc.. or stop */

结束。

终止(&E)

/* debugalert.i要在测试或开发环境中关闭断言,请删除此语句*/

全局定义DEBUGALERT (&G)

/*在测试代码中,您只需执行以下操作://测试断言*/

将变量h_ct定义为INT NO-UNDO INIT 10。

{assert.i &CONDITION="h_ct = 8"}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/811198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档