如何在一个简单的程序中修复 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 中获得了一个非零值。包含此内容的段落是 PERFORM
ed,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,您可以将您的图书馆扔掉。
我正在尝试在 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 中获得了一个非零值。包含此内容的段落是 PERFORM
ed,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,您可以将您的图书馆扔掉。