我正在尝试在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
//*
答案 0 :(得分:3)
U4038
abend是一个用户异常终止,来自语言环境,"运行时"对于大型机程序(它支持多种大型机语言)。
您有关于此的更多信息。如果您查看您的假脱机输出,我希望您能够找到更多信息。
您已在SELECT上为文件指定了FILE STATUS子句,因此U4038不太可能与文件相关。
但是,您可能遇到导致此程序问题的文件问题。
可能是问题所在。如果它不是 问题,则 问题:
IF WS-FILE-STATUS IS NOT EQUAL TO '00'
THEN
GO TO ERROR-EXIT
END-IF.
我怀疑你在WS-FILE-STATUS中得到非零值。包含此内容的段落为PERFORM
,而GO TO
将超出PERFORM的范围。当您测试非零文件状态时,DISPLAY
您遇到的非零值始终是个好主意。
在PERFORM范围之外使用GO TO特别糟糕。您的程序将从GO TO的目标段落继续,并继续顺序进入下一个代码。
你没有"下一个代码"。所以节目"结束了#34;。这不是一件有效的事情,所以你得到一个异常终止。
虽然我们无法看到副本的内容,但是假定非零文件状态的东西可能位于它之间,文件定义和您在DATAIN DD语句中指定的文件之间
最有可能的是,程序中定义的数据大小与JCL中指定的文件不匹配,或者程序中定义的密钥与JCL中的文件不匹配。
您需要在假脱机输出中找到附加消息。这通常会有很大帮助。如果你无法从中获取它,请粘贴步骤中的整个SYSOUT输出。
您使用的是最少数量的句号/句号,但最好在第12列中将它们放在自己的行上,这样它们就不会附加到任何代码上。然后,您无法复制代码,并在一个关键的错误位置意外地以句号/句号结束。
您还将收到编译器诊断,因为您的ERROR-EXIT不包含代码。始终查看您的消息并相应地更正代码。
还要注意缩进。它对编译器没有任何意义,但你为人类阅读器编写代码格式,所以请注意这一点,因为你永远不知道你什么时候会在一段时间后,或者你的队友在凌晨2点。或者您的导师/导师检查您的工作。
在您的linkedit / bind上,您指定了DISP = SHR。请改为DISP = OLD。如果您设法同时运行两个链接,则可以删除您的库。