多次退出导致编译器警告

时间:2020-02-03 15:35:11

标签: cobol

我有一个程序,在某些情况下,我想提早退出,而不是继续执行流程,而不必在调用段落中检查该退出较早的情况。

为此,我有一个段落“ EXIT-FAILURE”,该步骤检查以确保常规返回标志字段不正确(0),记录一条消息(DISPLAY),最后显示语句GOBACK

但是,这样做会在每个调用此“ EXIT-FAILURE”段的PERFORM上给我一个编译器警告: IGYCB7310-W The "PERFORM" statement at "PERFORM (line [line-number])" cannot reach its exit.

有什么办法可以使这种逻辑(基本上是多次退出/提前退出而不是一次退出),而不会产生编译器警告?

这个想法是否与COBOL的处理方式完全相反(我的经验更多是在Java中,在保护语句或异常的情况下这是完全正常的)?


编辑:添加Simon要求的最小程序:

IDENTIFICATION DIVISION.
PROGRAM-ID. SOQUEST.
ENVIRONMENT DIVISION.
DATA DIVISION.
PROCEDURE DIVISION.
   PERFORM A100-INITIALIZE
   PERFORM A200-VALIDATE

   PERFORM B200-PROCESS-STEP-1

   GOBACK
   .
A100-INITIALIZE.
   DISPLAY "INITIALIZED"
   .
A200-VALIDATE.
   PERFORM Z900-EXIT-FAILURE
   .
B200-PROCESS-STEP-1.
   DISPLAY "COMPLETED STEP 1"
   .
Z900-EXIT-FAILURE.
   GOBACK
   .

这两个与我的问题有关的警告结果

IGYCB7310-W   The "PERFORM" statement at "PERFORM (line 58.1)" cannot reach its exit.
IGYCB7310-W   The "PERFORM" statement at "PERFORM (line 68.1)" cannot reach its exit.

(第58.1行映射到“ PERFORM A200-VALIDATE”行;第68.1行映射到“ PERFORM Z900-EXIT-FAILURE”行)

4 个答案:

答案 0 :(得分:3)

从编译器警告和编译器手册的其他说明中可以看出,问题是您PERFORM做某事而PERFORM说“先做然后再回来”。

如果Enterprise COBOL for z / OS添加了对RAISE exception-name(最好是用户定义的异常)的支持,这将是解决问题的方法(既是问题中所要求的“ COBOL”,又是问题中所要求的“异常”) Java),然后将该段落作为DECLARATIVES放入EXIT-FAILURE SECTION. USE AFTER EXCEPTION CONDITION exception-name中。在此之前[=也许永远]:

如果现场没有反对的规则:请使用GO TO EXIT-FAILURE-这个COBOL动词说“去那儿”(而且可能不会回来,尤其是像您这样命名的段落)。 / p>

如果存在反对GO TO的规则-请使用@cschneid的方法-在标头中添加有关此警告的注释,并在发生其他注释时直接引用此注释。

旁注:我个人仍会尝试将段落放入DECLARATIVES(现在不变,只是将其向上移动) (DECLARATIVES)来扩展点“仅在出现问题时才调用”。但是在这种情况下,您的编译器可能会再次发出警告甚至错误(至少“标准” -COBOL在那里需要使用声明)。

答案 1 :(得分:1)

我对this compiler warning的反应将是在源中添加一条注释,表明预期会出现警告。 IBM Enterprise COBOL 6.3(截至该日期的最新版本)不支持RAISE语句。

与执行执行EXEC CICS RETURN的段落没什么不同。

@SimonSobisch对COBOL的了解比以往任何时候都多,并希望提供一个示例,说明如何更符合“ COBOL方式”来解决此问题,这对将来的知识寻求者很有用。

答案 2 :(得分:0)

使用EXIT PARAGRAPH可以帮助避免转到,编译警告和注释...

updatePassword

答案 3 :(得分:-1)

尝试以下操作:

Z900-EXIT-FAILURE.
    IF <some condition that is always true>
        GOBACK
    END-IF
    .

只要编译器优化器无法确定IF条件始终为真这一事实,它就不会发出警告消息。

对下面的评论和其他一些建议的回应...

某些将来发行版中的编译器优化可能会确定条件始终为真并将其删除: 这将导致警告消息返回。发生该问题时要面对该问题。就目前而言 类似于:{{1} 不会被优化,并且可能不会持续很多年。

可能会产生效率较低的代码: 本段的全部要点是退出程序。的 IF FUNCTION WHEN-COMPILED <= FUNCTION CURRENT-DATE测试所需的额外说明不应产生可衡量的影响 在性能上。

禁用诊断: 可以使用编译器出口捕获并执行 使消息无效,请参阅:https://www.ibm.com/support/knowledgecenter/en/SS6SG3_6.3.0/pg/ref/rpext10.html。 我会对此警告,因为有效的警告也可能会被抑制,其中一些 也许不应该被忽略。

在代码中添加注释以表明警告可以接受: 并非所有的程序员都如此努力,以至于可以继续审查一次编译器警告。 他们发现有时他们可以接受。很有可能错过有效的警告 将来。

使用说明: IBM Enterprise COBOL编译器支持IF处理与I / O相关的错误 并进行调试仅使其使用受到一定限制。此外,关于DECLARATIVES还是STOP RUN还有许多其他限制 可能在DECLARATIVE过程处于活动状态时发出。我会毫不犹豫地建议使用DECLARATIVES。 语言环境为 建立用户定义的条件处理,但这是一个相当高级的主题。 参见:https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/com.ibm.zos.v2r1.ceea800/ceea824.htm

使用GOBACK GO TO Z900-EXIT-FAILURE被编译器识别为控制权转移 并且不会发出消息IGYCB7310-W,只要GO TO有条件 执行(例如包含在GO或其他条件语句中)。这可能是提供的最佳解决方案 当地编码标准许可证 在这种情况下使用IF TO。有些地方对GO TO 并且在任何情况下都不允许。