如何在一个简单的程序中修复 U4038

How to fix a U4038 in a simple program

我正在尝试在 z/OS 大型机系统上执行一个简单的 COBOL 程序。该程序仅打开和关闭一个文件。它编译没有错误,但是当我 运行 它时,我得到一个 U4038 异常终止。

这是程序的代码:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7-|--+----8
        IDENTIFICATION DIVISION.
        PROGRAM-ID. LISTKSDS
        AUTHOR. TestingUser

        ENVIRONMENT DIVISION.
        CONFIGURATION SECTION.
        INPUT-OUTPUT SECTION.
        FILE-CONTROL.
           SELECT INFILE ASSIGN TO DATAIN
             ORGANIZATION IS INDEXED
             ACCESS MODE IS SEQUENTIAL
             RECORD KEY EST-KEY
             FILE STATUS IS WS-FILE-STATUS.

        DATA DIVISION.
        FILE SECTION.
        FD INFILE.
        COPY EST01.

        WORKING-STORAGE SECTION.
        01 VARIABLES.
           05 WS-FILE-STATUS    PIC X(2).

        LINKAGE SECTION.

        PROCEDURE DIVISION.
             DISPLAY "STARTING PROGRAM.."
             PERFORM INITIALIZATION
             PERFORM TERMINATION
             GOBACK.

        INITIALIZATION.
             DISPLAY "OPENING FILE.."
             OPEN INPUT INFILE
             IF WS-FILE-STATUS IS NOT EQUAL TO '00'
             THEN
             GO TO ERROR-EXIT
             END-IF.

        TERMINATION.
             CLOSE INFILE.

        ERROR-EXIT.

要编译的作业:

//TESTUSEC  JOB NERT4587,CLASS=C,MSGCLASS=X,NOTIFY=&SYSUID
//*
//STEP1   EXEC IGYWCL,PARM=(LIB)
//SYSLIB DD DSN=TES.COPIES.TEST,DISP=SHR
//COBOL.SYSIN DD DSN=TES.SOFT.SRC(SRC04),DISP=SHR
//LKED.SYSLMOD DD DISP=SHR,DSN=TES.SOFT.LIB
//LKED.SYSIN   DD *
   ENTRY LISTKSDS
   NAME  LISTKSDS(R)
/*
//*

要提交的作业:

//TESTUSEC  JOB NERT4587,CLASS=C,MSGCLASS=X,NOTIFY=&SYSUID
//*
//JOBLIB  DD DSN=TES.SOFT.LIB,DISP=SHR
//*
//STEP1   EXEC PGM=LISTKSDS,REGION=2M
//DATAIN  DD DSN=TES.VS.TEST,DISP=SHR
//*

A U4038 异常终止是来自语言环境的用户异常终止,"run-time" 用于大型机程序(它支持多种大型机语言)。

你有更多关于这方面的信息。如果您查看假脱机输出,我希望您能够找到更多信息。

您已在 SELECT 上为您的文件指定了 FILE STATUS 子句,因此 U4038 不太可能与文件相关。

但是,很可能是您遇到了导致此程序问题的文件问题。

可能是问题所在。如果不是的问题,就是一个的问题:

         IF WS-FILE-STATUS IS NOT EQUAL TO '00'
         THEN
         GO TO ERROR-EXIT
         END-IF.

我怀疑您在 WS-FILE-STATUS 中获得了一个非零值。包含此内容的段落是 PERFORMed,GO TO 将您带出 PERFORM 的范围。当您测试非零文件状态时,DISPLAY 您遇到的非零值总是一个好主意。

在 PERFORM 的范围之外使用 GO TO 尤其糟糕。您的程序将从 GO TO 的目标段落继续,并继续按顺序进入下一个代码。

你没有"next code"。所以程序"falls off the end"。这不是一件有效的事情,所以你会中止。

虽然我们看不到copybook的内容,但给出假定的非零文件状态的东西可能位于文件定义和您在DATAIN DD语句中指定的文件之间.

很可能是你程序中定义的数据大小与JCL中命名的文件不匹配,或者程序中定义的键与JCL中的文件不匹配。

您需要在假脱机输出中找到附加消息。这通常会有很大帮助。如果您无法从中获取它,请粘贴该步骤的整个 SYSOUT 输出。

您正在使用最少数量的 full-stops/periods,但最好将它们单独放在一行中,在第 12 列中,这样它们就不会附加到任何代码。然后你就不能复制代码,不小心在一个严重错误的地方得到了一个 full-stop/period。

您还会收到编译器诊断,因为您的 ERROR-EXIT 不包含任何代码。始终查看您的消息并相应地更正代码。

还要注意缩进。它对编译器没有任何意义,但是你格式化代码是为了人reader,所以请注意这一点,因为你永远不知道什么时候会是你,或者你的队友之一凌晨 2 点。或者您的 tutor/mentor 审查您的工作。

在您的 linkedit/bind 上,您指定了 DISP=SHR。请将其更改为 DISP=OLD。如果您设法同时 运行 两个 linkedit,您可以将您的图书馆扔掉。