ILE COBOL – Error Handling
Error Handling – Introduction
Error handling is a method used to handle potential runtime errors by sending messages to the user or program, or by routing the program flow so that the program abend can be skipped.
COBOL400:
Native COBOL uses 2 basic error handling methods:
- File status codes for I/O file operations.
- In-line phrases such as AT END, INVALID KEY, and NO LOCK for I/O file operations. Also, in-line phrases such as ON SIZE, ON OVERFLOW, and ON EXCEPTION for string, arithmetic, and CALL operations respectively.
- Declarative Section.
ILE COBOL:
ILE COBOL utilizes IBMi features to access detailed run-time and exception information. There are two clauses that helps in gathering run-time information:
- File status codes for I/O file operations.
- In-line phrases such as AT END, INVALID KEY, and NO LOCK for I/O file operations. Also, in-line phrases such as ON SIZE, ON OVERFLOW, and ON EXCEPTION for string, arithmetic, and CALL operations respectively.
- Declarative Section.
Error Handling Techniques in COBOL400 or ILE COBOL
There are 5 methods in which error handling mechanism in ILE COBOL can be categorised:
- COBOL Verb in-line phrases
- File Status for I/O operations
- Declarative Sections
- PROGRAM STATUS Clause in Special-Name paragraph
- OPEN-FEEDBACK Clause in Special-Name paragraph
- I-O-FEEDBACK Clause in Special-Name paragraph
In-Line Phrases
To handle command-level errors in native COBOL programs, in-line phrases are provided to specific COBOL verbs. These are like:
- Command-level error handling in CL programs using the MONMSG command.
- Command-level error handling in RPGLE programs using the MONITOR, ON-ERROR, and ENDMON opcodes.
Below are the in-line phrases that handles and traps the error:
- Handling errors in string operations (ON OVERFLOW)
- Handling errors in arithmetic operations (ON SIZE ERROR)
- Handling errors in CALL statements (ON EXCEPTION/ON OVERFLOW)
- Handling errors in I/O operations (AT END, INVALID KEY, NO LOCK)
File Status for I/O operations
In native COBOL, the FILE STATUS clause in the FILE-CONTROL paragraph of the INPUT-OUTPUT SECTION of the ENVIRONMENT DIVISION is used to monitor the execution of each input-output operation for a specific file. The FILE STATUS clause is a 2-character string that changes with each file operation and helps in error handling and trapping.
Declarative Sections
In native COBOL, Declaratives are special-purpose sections within the PROCEDURE DIVISION
that are used to handle specific conditions or events, such as I/O errors or debugging scenarios.
They provide a structured way to define actions to be taken when these conditions arise that are
automatically invoked when specific exceptional conditions arise, primarily concerning I/O errors or debugging
events.
This eliminates the need to explicitly check file status codes after every I/O operation, streamlining error
management, and making the code cleaner and more efficient. It acts as program-level error handling in COBOL
programs.
PROGRAM STATUS Clause
In ILE COBOL, the PROGRAM STATUS clause within the SPECIAL-NAMES paragraph of the ENVIRONMENT DIVISION provides error information at runtime. PROGRAM STATUS is a group variable of 94 characters. The exception message ID is contained in characters 47 through 53 (7 characters). Programmers can use this message ID to trap errors and redirect the program flow.
OPEN-FEEDBACK Clause
In ILE COBOL on IBMi, OPEN-FEEDBACK clause within the SPECIAL-NAMES paragraph of the ENVIRONMENT DIVISION are special areas capturing detail information about a file, but only when the file is open. These details can be captured through ACCEPT statement.
I-O-FEEDBACK Clause
In ILE COBOL on IBMi, I-O-FEEDBACK clause within the SPECIAL-NAMES paragraph of the ENVIRONMENT DIVISION are special areas capturing detail information about the last I-O operation on a file, but only when the file is open. These details can be captured through ACCEPT statement.
Error Handling via file status
Native COBOL file status provides information about the result of each file operation executed. The file status changes after every file operation. It consists of 2-digit character and below is the important file status:
- ’00’ – Successful operation.
- ‘10’ – File End-of-file reached during an input operation.
- ‘22’ – Duplicate key in an indexed or relative file having unique constraint.
- ‘23’ – Record not found.
- ‘35’ – File not found in library list.
- ‘41’ – Open operation has been tried on a file which is already opened.
- ‘42’ – File not open – Cannot be closed.
- ‘47’ – Attempted I/O operation on a file when file is not opened.
- ‘90’ – Record lock.
- ‘94’ – Delete operation failed as read operation was not successful.
- ‘9S’ – Delete operation failed as the last record was read with no lock.
1. OPEN and CLOSE verbs
►For COBOL verbs -> OPEN and CLOSE, if file status changes not equal to 0 after operations, then it means file operation fails.
Example 1: OPEN Verb file Status handling
* ---------- * Open Files * ---------- OPEN-FILES-PARA. OPEN INPUT ACCT-FILE OUTPUT ACCTX-FILE. IF WS-ACCT-STATUS NOT = '00' DISPLAY 'ERROR IN OPENING FILE: ACCT-FILE' WS-ACCT-STATUS END-IF. IF WS-ACCTX-STATUS NOT = '00' DISPLAY 'ERROR IN OPENING FILE: ACCTX-FILE' WS-ACCTX-STATUS END-IF. OPEN-FILES-PARA-EXIT. EXIT.
Example 2: CLOSE Verb Status handling
* -----------
* Close files
* -----------
CLOSE-FILES-PARA.
CLOSE ACCT-FILE
ACCTX-FILE.
IF WS-ACCT-STATUS NOT = "00"
DISPLAY 'ERROR IN CLOSING FILE :ACCT-FILE'
WS-ACCT-STATUS
END-IF.//
IF WS-ACCTX-STATUS NOT = "00"
DISPLAY 'ERROR IN CLOSING FILE :ACCTX-FILE'
WS-ACCTX-STATUS
END-IF.
CLOSE-FILES-PARA-EXIT. EXIT.
2. READ NEXT (Sequential Read and dynamic read)/READ FIRST/LAST/PRIOR (Dynamic read)
► For READ NEXT/FIRST/LAST/PRIOR, if status code is not equal to 0 or 10 then file operation is failed.
- ‘0’ – Successful
- ‘10’ – AT END or no records are left to read.
Example 1: READ Verb status handling (Sequential Read)
* -----------------------------
* Read all records sequentially
* -----------------------------
READ-ACCT-PARA.
READ ACCT-FILE NEXT RECORD
IF WS-ACCT-STATUS = "10"
STOP RUN.
ELSE
IF WS-ACCT-STATUS NOT = "00"
DISPLAY 'ERROR IN READING FILE: ACCT-FILE'
WS-ACCT-STATUS
END-IF
END-IF.
Example 2: When access mode is dynamic and first record is read and just after that PRIOR record is read, it reaches status = 10 (BOF – Beginning of file is reached) READ Verb status handling (Dynamic Read)
READ-ACCT-PARA.
READ ACCT-FILE FIRST RECORD
IF WS-ACCT-STATUS = "10"
GO TO READ-ACCT-PARA-EXIT
ELSE
IF WS-ACCT-STATUS NOT = "00"
DISPLAY 'ERROR IN READING FILE: ACCT-FILE'
WS-ACCT-STATUS
END-IF
END-IF.
READ ACCT-FILE PRIOR RECORD
* Check if beginning of file is reached.
IF WS-ACCT-STATUS = "10"
GO TO READ-ACCT-PARA-EXIT
ELSE
IF WS-ACCT-STATUS NOT = "00"
DISPLAY 'ERROR IN READING FILE: ACCT-FILE'
WS-ACCT-STATUS
END-IF
END-IF.
3. READ RECORD
►For READ RECORD, if status code = ‘23’ then file operation fails.
Example 1: READ Verb status handling (Random Read)
READ-ACCT-PARA.
READ ACCT-FILE FIRST RECORD
IF WS-ACCT-STATUS = "10"
GO TO READ-ACCT-PARA-EXIT
ELSE
IF WS-ACCT-STATUS NOT = "00"
DISPLAY 'ERROR IN READING FILE: ACCT-FILE'
WS-ACCT-STATUS
END-IF
END-IF.
READ ACCT-FILE PRIOR RECORD
* Check if beginning of file is reached.
IF WS-ACCT-STATUS = "10"
GO TO READ-ACCT-PARA-EXIT
ELSE
IF WS-ACCT-STATUS NOT = "00"
DISPLAY 'ERROR IN READING FILE: ACCT-FILE'
WS-ACCT-STATUS
END-IF
END-IF.
Output:
RECORD NOT FOUND : ACCT-FILE FS-23
4. REWRITE
►For Sequential file, index, relative file with unique or non-unique constraint, if status code != 0 then file operation fails.
Example 1: REWRITE Verb status handling (After Sequential Read)
READ-ACCT-PARA.
MOVE '04' TO DIVID OF ACCT-FILE.
MOVE '405' TO ACCTNO OF ACCT-FILE.
READ ACCT-FILE RECORD.
IF WS-ACCT-STATUS = "23"
DISPLAY 'RECORD NOT FOUND :ACCT-FILE FS-'
WS-ACCT-STATUS
END-IF.
READ-ACCT-PARA-EXIT. EXIT.
Output:
RECORD NOT FOUND : ACCT-FILE FS-23
Example 2: REWRITE Verb status handling (After Random Read)
READ-ACCT-PARA.
MOVE '04' TO DIVID OF ACCT-FILE.
MOVE '405' TO ACCTNO OF ACCT-FILE.
READ ACCT-FILE RECORD.
IF WS-ACCT-STATUS = "23"
DISPLAY 'RECORD NOT FOUND :ACCT-FILE FS-'
WS-ACCT-STATUS
END-IF.
READ-ACCT-PARA-EXIT. EXIT.
Output:
RECORD NOT FOUND : ACCT-FILE FS-23
5. WRITE
►For Sequential file, index or relative file with non-unique constraint, if status code != 0 then file operation fails.
►For indexed file having unique constraint:
- if status code = ‘22’, then ‘Attempted to write a duplicate record’.
- if status code <> 0, then file operation fails.
Example 1: WRITE Verb status handling (After Sequential Read)
READ-ACCT-PARA.
MOVE '04' TO DIVID OF ACCT-FILE.
MOVE '405' TO ACCTNO OF ACCT-FILE.
READ ACCT-FILE RECORD.
IF WS-ACCT-STATUS = "23"
DISPLAY 'RECORD NOT FOUND :ACCT-FILE FS-'
WS-ACCT-STATUS
END-IF.
READ-ACCT-PARA-EXIT. EXIT.
Output:
RECORD NOT FOUND : ACCT-FILE FS-23
Example 2: WRITE Verb status handling (After Random Read)
READ-ACCT-PARA.
MOVE '04' TO DIVID OF ACCT-FILE.
MOVE '405' TO ACCTNO OF ACCT-FILE.
READ ACCT-FILE RECORD.
IF WS-ACCT-STATUS = "23"
DISPLAY 'RECORD NOT FOUND :ACCT-FILE FS-'
WS-ACCT-STATUS
END-IF.
READ-ACCT-PARA-EXIT. EXIT.
Output:
RECORD NOT FOUND : ACCT-FILE FS-23
5. DELETE
►For Sequential file, index or relative file with non-unique constraint, if status code != 0 then file operation fails.
- if status code = ‘94’, then ‘Delete operation attempted before read operation’
- if status code = ‘9S’, then ‘Delete operation attempted on read with no lock record’
- if status code != 0, then file operation fails.
Example 1: DELETE verb status handling (When Status code = ‘94’)
IDENTIFICATION DIVISION.
*------------------------*
PROGRAM-ID. DELETEOP01.
AUTHOR. PROGRAMMER.
ENVIRONMENT DIVISION.
*---------------------*
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBMi-Series.
OBJECT-COMPUTER. IBMi-Series.
INPUT-OUTPUT SECTION.
*---------------------*
FILE-CONTROL.
SELECT ACCT-FILE
ASSIGN TO DATABASE-ACCTPF
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS EXTERNALLY-DESCRIBED-KEY
WITH DUPLICATES
FILE STATUS IS WS-ACCT-STATUS.
DATA DIVISION.
*--------------*
FILE SECTION.
FD ACCT-FILE
LABEL RECORDS ARE STANDARD.
01 ACCT-RCD.
COPY DDS-ALL-FORMATS OF ACCTPF
WITH PREFIX BY 'A-'.
WORKING-STORAGE SECTION.
*-----------------------*
77 WS-ACCT-STATUS PIC XX.
*------------------*
PROCEDURE DIVISION.
*------------------*
MAINLINE.
PERFORM OPEN-FILES-PARA
THRU OPEN-FILES-PARA-EXIT.
PERFORM READ-ACCT-PARA
THRU READ-ACCT-PARA-EXIT.
PERFORM CLOSE-FILES-PARA
THRU CLOSE-FILES-PARA-EXIT.
STOP RUN.
* ----------
* Open Files
* ----------
OPEN-FILES-PARA.
OPEN I-O ACCT-FILE.
IF WS-ACCT-STATUS NOT = '00'
DISPLAY 'ERROR IN OPENING FILE: ACCT-FILE' WS-ACCT-STATUS
END-IF.
OPEN-FILES-PARA-EXIT. EXIT.
* ------------------------------
* Read sequentially with no lock
* ------------------------------
READ-ACCT-PARA.
DELETE ACCT-FILE RECORD
IF WS-ACCT-STATUS NOT = 0
DISPLAY 'ERROR IN DELETE OPERATION: ' WS-ACCT-STATUS
END-IF
READ-ACCT-PARA-EXIT. EXIT.
* -----------
* Close files
* -----------
CLOSE-FILES-PARA.
CLOSE ACCT-FILE.
IF WS-ACCT-STATUS NOT = "00"
DISPLAY 'ERROR IN CLOSING FILE :ACCT-FILE'
WS-ACCT-STATUS
END-IF.
CLOSE-FILES-PARA-EXIT. EXIT.
Screenshot while debugging:
Display Module Source
Program: DELETEOP01 Library: TESTLAB Module: DELETEOP01
57 * ------------------------------
58 READ-ACCT-PARA.
59 DELETE ACCT-FILE RECORD
60 IF WS-ACCT-STATUS NOT = 0
61 DISPLAY 'ERROR IN DELETE OPERATION: ' WS-ACCT-STATUS
62 END-IF
63 READ-ACCT-PARA-EXIT. EXIT.
64
65 * -----------
66 * Close files
67 * -----------
68 CLOSE-FILES-PARA.
69 CLOSE ACCT-FILE.
70 IF WS-ACCT-STATUS NOT = "00"
71 DISPLAY 'ERROR IN CLOSING FILE :ACCT-FILE'
More...
Debug . . .
F3=End program F6=Add/Clear breakpoint F10=Step F11=Display variable
F12=Resume F17=Watch variable F18=Work with watch F24=More keys
WS-ACCT-STATUS = '94'
Output:
ERROR IN DELETE OPERATION: 94
Example 2: DELETE verb status handling (When Status code = ‘9S’)
IDENTIFICATION DIVISION.
*------------------------*
PROGRAM-ID. DELETEOP02.
AUTHOR. PROGRAMMER.
ENVIRONMENT DIVISION.
*---------------------*
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBMi-Series.
OBJECT-COMPUTER. IBMi-Series.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT ACCT-FILE
ASSIGN TO DATABASE-ACCTPF
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS EXTERNALLY-DESCRIBED-KEY
WITH DUPLICATES
FILE STATUS IS WS-ACCT-STATUS.
DATA DIVISION.
*--------------*
FILE SECTION.
FD ACCT-FILE
LABEL RECORDS ARE STANDARD.
01 ACCT-RCD.
COPY DDS-ALL-FORMATS OF ACCTPF
WITH PREFIX BY 'A-'.
WORKING-STORAGE SECTION.
*-----------------------*
77 WS-ACCT-STATUS PIC XX.
PROCEDURE DIVISION.
*-------------------*
MAINLINE.
PERFORM OPEN-FILES-PARA
THRU OPEN-FILES-PARA-EXIT.
PERFORM READ-ACCT-PARA
THRU READ-ACCT-PARA-EXIT.
PERFORM CLOSE-FILES-PARA
THRU CLOSE-FILES-PARA-EXIT.
STOP RUN.
* ----------
* Open Files
* ----------
OPEN-FILES-PARA.
OPEN I-O ACCT-FILE.
IF WS-ACCT-STATUS NOT = '00'
DISPLAY 'ERROR IN OPENING FILE: ACCT-FILE' WS-ACCT-STATUS
END-IF.
OPEN-FILES-PARA-EXIT. EXIT.
* ------------------------------
* Read sequentially with no lock
* ------------------------------
READ-ACCT-PARA.
READ ACCT-FILE NEXT RECORD WITH NO LOCK
IF WS-ACCT-STATUS NOT = 0
DELETE ACCT-FILE RECORD
IF WS-ACCT-STATUS NOT = 0
DISPLAY 'ERROR IN DELETE OPERATION: ' WS-ACCT-STATUS
END-IF
END-IF.
READ-ACCT-PARA-EXIT. EXIT.
* -----------
* Close files
* -----------
CLOSE-FILES-PARA.
CLOSE ACCT-FILE.
IF WS-ACCT-STATUS NOT = "00"
DISPLAY 'ERROR IN CLOSING FILE :ACCT-FILE'
WS-ACCT-STATUS
END-IF.
CLOSE-FILES-PARA-EXIT. EXIT.
Screenshot while debugging
Display Module Source
Program: DELETEOP02 Library: TESTLAB Module: DELETEOP02
58 * ------------------------------
59 * Read sequentially with no lock
60 * ------------------------------
61 READ-ACCT-PARA.
62 READ ACCT-FILE NEXT RECORD WITH NO LOCK
63 IF WS-ACCT-STATUS NOT = 0
64 DELETE ACCT-FILE RECORD
65 IF WS-ACCT-STATUS NOT = 0
66 DISPLAY 'ERROR IN DELETE OPERATION: ' WS-ACCT-STATUS
67 END-IF
68 END-IF.
69
70 READ-ACCT-PARA-EXIT. EXIT.
71
72 * -----------
More...
Debug . . .
F3=End program F6=Add/Clear breakpoint F10=Step F11=Display variable
F12=Resume F17=Watch variable F18=Work with watch F24=More keys
WS-ACCT-STATUS = '9S'
Output:
ERROR IN DELETE OPERATION: 9S
7. START
►For index and relative file with unique or non-unique constraint, if status code != 0 then start file operation is failed.
Example 2: DELETE verb status handling (When Status code = ‘9S’)
IDENTIFICATION DIVISION.
*------------------------*
PROGRAM-ID. DELETEOP03.
AUTHOR. PROGRAMMER.
ENVIRONMENT DIVISION.
*---------------------*
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBMi-Series.
OBJECT-COMPUTER. IBMi-Series.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT ACCT-FILE
ASSIGN TO DATABASE-ACCTPF
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS EXTERNALLY-DESCRIBED-KEY
WITH DUPLICATES
FILE STATUS IS WS-ACCT-STATUS.
DATA DIVISION.
*--------------*
FILE SECTION.
FD ACCT-FILE
LABEL RECORDS ARE STANDARD.
01 ACCT-RCD.
COPY DDS-ALL-FORMATS OF ACCTPF
WITH PREFIX BY 'A1-’.
WORKING-STORAGE SECTION.
*-----------------------*
77 WS-ACCT-STATUS PIC XX.
PROCEDURE DIVISION.
*-------------------*
MAINLINE.
PERFORM OPEN-FILES-PARA
THRU OPEN-FILES-PARA-EXIT.
PERFORM READ-ACCT-PARA
THRU READ-ACCT-PARA-EXIT.
PERFORM CLOSE-FILES-PARA
THRU CLOSE-FILES-PARA-EXIT.
STOP RUN.
* ----------
* Open Files
* ----------
OPEN-FILES-PARA.
OPEN I-O ACCT-FILE.
IF WS-ACCT-STATUS NOT = '00'
DISPLAY 'ERROR IN OPENING FILE: ACCT-FILE' WS-ACCT-STATUS
END-IF.
OPEN-FILES-PARA-EXIT. EXIT.
* ------------------------------
* Read sequentially with no lock
* ------------------------------
READ-ACCT-PARA.
READ ACCT-FILE NEXT RECORD WITH NO LOCK
IF WS-ACCT-STATUS NOT = 0
DELETE ACCT-FILE RECORD
IF WS-ACCT-STATUS NOT = 0
DISPLAY 'ERROR IN DELETE OPERATION: ' WS-ACCT-STATUS
END-IF
END-IF.
READ-ACCT-PARA-EXIT. EXIT.
* -----------
* Close files
* -----------
CLOSE-FILES-PARA.
CLOSE ACCT-FILE.
IF WS-ACCT-STATUS NOT = "00"
DISPLAY 'ERROR IN CLOSING FILE :ACCT-FILE'
WS-ACCT-STATUS
END-IF.
CLOSE-FILES-PARA-EXIT. EXIT.
Screenshot while debugging
Display Module Source
Program: DELETEOP02 Library: TESTLAB Module: DELETEOP02
58 * ------------------------------
59 * Read sequentially with no lock
60 * ------------------------------
61 READ-ACCT-PARA.
62 READ ACCT-FILE NEXT RECORD WITH NO LOCK
63 IF WS-ACCT-STATUS NOT = 0
64 DELETE ACCT-FILE RECORD
65
66 DISPLAY 'ERROR IN DELETE OPERATION: ' WS-ACCT-STATUS
67 END-IF
68 END-IF.
69
70 READ-ACCT-PARA-EXIT. EXIT.
71
72 * -----------
More...
Debug . . .
F3=End program F6=Add/Clear breakpoint F10=Step F11=Display variable
F12=Resume F17=Watch variable F18=Work with watch F24=More keys
WS-ACCT-STATUS = '9S'
Output:
ERROR IN DELETE OPERATION: 9S
Other Runtime Errors
The monitor message MCH3601 refers to the below two types of errors in ILE COBOL: TYPE01: Error occurring due to parameters not passed into called program.
Example – TYPE01 – When no parameter is passed into a called program.
IDENTIFICATION DIVISION.
* -----------------------*
PROGRAM-ID. ERROR004.
AUTHOR. PROGRAMMER.
ENVIRONMENT DIVISION.
* --------------------*
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ISERIES.
OBJECT-COMPUTER. IBM-ISERIES.
DATA DIVISION.
* -------------*
WORKING-STORAGE SECTION.
01 WS-PARM-01 PIC X(05).
LINKAGE SECTION.
01 LK-PARM-01 PIC X(05).
PROCEDURE DIVISION USING LK-PARM-01.
* ------------------*
MAINLINE-PARA.
MOVE LK-PARM-01 TO WS-PARM-01.
STOP RUN.
Screenshot during debugging:
16 PROCEDURE DIVISION USING LK-PARM-01.
18 MAINLINE-PARA.
19 MOVE LK-PARM-01 TO WS-PARM-01.
20 STOP RUN.
Error:
Pointer not set for location referenced.
TYPE02: Error occurring when a field of the file is used either the file is not opened or closed.
Example – TYPE02 – When no parameter is passed into a called program.
IDENTIFICATION DIVISION.
* -----------------------*
PROGRAM-ID. ERROR005.
AUTHOR. PROGRAMMER.
ENVIRONMENT DIVISION.
* --------------------*
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ISERIES.
OBJECT-COMPUTER. IBM-ISERIES.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT ORDER-FILE
ASSIGN TO DATABASE-ORDER
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS EXTERNALLY-DESCRIBED-KEY
DATA DIVISION.
* -------------*
FILE SECTION.
FD ORDER-FILE LABEL RECORDS ARE STANDARD.
01 ORDER-REC.
COPY DDS-ORDERR OF ORDER.
PROCEDURE DIVISION.
* ------------------*
MAINLINE-PARA.
MOVE 20250101 TO ORDERDT.
OPEN INPUT ORDER-FILE.
CLOSE ORDER-FILE.
STOP RUN.
Screenshot during debugging:
22 COPY DDS-ORDERR OF ORDER. 23 PROCEDURE DIVISION. 24 *█------------------* 25 MAINLINE-PARA. 26 MOVE 20250101 TO ORDERDT. 27 OPEN INPUT ORDER-FILE. 28 CLOSE ORDER-FILE. 29 STOP RUN.
Error:
Pointer not set for location referenced.
MCH0603 – Range of Subscript Error or Character String Error
The monitor message MCH0603 refers to the below two types of errors in ILE COBOL: TYPE01: Error occurring due to the invalid range of index values of a table referred to as “Range of subscript error”. It occurs when index-value is either less than the lower bound of 1, or greater than the upper bound defined by the OCCURS clause.
Example – TYPE01 – Range of Subscript errors.
IDENTIFICATION DIVISION.
* -----------------------*
PROGRAM-ID. ERROR003.
AUTHOR. PROGRAMMER.
DATA DIVISION.
* -------------*
WORKING-STORAGE SECTION.
01 DATA-TABLE.
03 DATA-ITEM PIC X(10) OCCURS 3 TIMES.
01 IDX PIC S9(02).
PROCEDURE DIVISION.
* ------------------*
000-MAINLINE-PARA.
MOVE "DATA" TO DATA-ITEM(IDX).
STOP RUN.
Screenshot for runtime error:
15 01 IDX PIC S9(02).
16 PROCEDURE DIVISION.
17 *█------------------*
18 000-MAINLINE-PARA.
19 MOVE "DATA" TO DATA-ITEM(IDX).
20 STOP RUN.
Error:
Range of subscript value or character string error.
TYPE02: Error occurring due to invalid range of start position or buffer length during reference modification referred to as “Character String Error”. It will occur due to following reasons:
►Case 01: When START-POSITION less than 1 or START-POSITION & START-POSITION greater than Size of the input String.
►Case 02: When START-POSITION + BUFFER-LENGTH – 1 > Size of the input String.
Example – TYPE 02: Case 01 – Character String Error.
IDENTIFICATION DIVISION.
* -----------------------*
PROGRAM-ID. ERROR001.
AUTHOR. PROGRAMMER.
DATA DIVISION.
* -------------*
WORKING-STORAGE SECTION.
01 INPUT-STRING-VAR PIC X(34) VALUE 'MCH0603 - RANGE OF SUBSCR
- IPT ERROR'.
01 OUTPUT-STRING-VAR PIC X(10).
01 START-POSITION PIC 9(02) VALUE 21.
01 BUFFER-LENGTH PIC 9(02) VALUE 20.
PROCEDURE DIVISION.
* ------------------*
000-MAINLINE-PARA.
MOVE INPUT-STRING-VAR(START-POSITION:BUFFER-LENGTH)
TO OUTPUT-STRING-VAR.
STOP RUN.
Screenshot for runtime error:
18 19 PROCEDURE DIVISION. 20 *█------------------* 21 000-MAINLINE-PARA. 22 MOVE INPUT-STRING-VAR(START-POSITION:BUFFER-LENGTH) 23 TO OUTPUT-STRING-VAR. 24 STOP RUN.
Error:
Range of subscript value or character string error.
Example – TYPE 02: Case 02 – Character String Error.
IDENTIFICATION DIVISION.
* -----------------------*
PROGRAM-ID. ERROR002.
AUTHOR. PROGRAMMER.
DATA DIVISION.
* -------------*
WORKING-STORAGE SECTION.
01 INPUT-STRING-VAR PIC X(34) VALUE 'MCH0603 - RANGE OF SUBSCR
- IPT ERROR'.
01 OUTPUT-STRING-VAR PIC X(10).
01 START-POSITION PIC 9(02) VALUE 21.
01 BUFFER-LENGTH PIC 9(02) VALUE 20.
PROCEDURE DIVISION.
* ------------------*
000-MAINLINE-PARA.
MOVE INPUT-STRING-VAR(START-POSITION:BUFFER-LENGTH)
TO OUTPUT-STRING-VAR.
STOP RUN.
Screenshot for runtime error:
18 19 PROCEDURE DIVISION. 20 *█------------------* 21 000-MAINLINE-PARA. 22 MOVE INPUT-STRING-VAR(START-POSITION:BUFFER-LENGTH) 23 TO OUTPUT-STRING-VAR. 24 STOP RUN.
Error:
Range of subscript value or character string error.
Programmers should apply check in the complex programs as below:
IDENTIFICATION DIVISION.
* -----------------------*
PROGRAM-ID. ERROR001.
AUTHOR. PROGRAMMER.
DATA DIVISION.
* -------------*
WORKING-STORAGE SECTION.
01 INPUT-STRING-VAR PIC X(34) VALUE 'MCH0603 - RANGE OF SUBSCR
- IPT ERROR'.
01 OUTPUT-STRING-VAR PIC X(10).
01 START-POSITION PIC 9(02) VALUE 26.
01 BUFFER-LENGTH PIC 9(02) VALUE 10.
01 ERROR-MESSAGE PIC X(50).
PROCEDURE DIVISION.
* ------------------*
000-MAINLINE-PARA.
IF START-POSITION < 01 OR
START-POSITION > 34 OR
START-POSITION + BUFFER-LENGTH – 1 > 34
MOVE SPACES TO OUTPUT-STRING-VAR
MOVE ‘ERROR!’ TO ERR0R-MESSAGE
ELSE
MOVE INPUT-STRING-VAR(START-POSITION:BUFFER-LENGTH)
TO OUTPUT-STRING-VAR
END-IF.
STOP RUN.
Arithmetic Operations Error Handling
The arithmetic operations (e.g. ADD, SUBTRACT, MULTIPLY, DIVIDE, or COMPUTE) will either produce a larger value than the target variable size or have tried dividing by zero at runtime. The program execution fails because of the above error. ON SIZE ERROR phrase can handle the scenarios if they are coded with arithmetic statements.
Example 1: Handling SIZE ERROR on COMPUTE verb
IDENTIFICATION DIVISION. * -----------------------* PROGRAM-ID. ERRHNDL01. AUTHOR. PROGRAMMER. DATA DIVISION. * ------------* WORKING-STORAGE SECTION. 01 WS-NUM-VAR PIC 9(03). 01 WS-RES-VAR PIC 9(03). PROCEDURE DIVISION. * -----------------------* COMPUTE WS-NUM-VAR = 100. COMPUTE WS-RES-VAR = WS-NUM-VAR * 10 ON SIZE ERROR DISPLAY 'ERROR: SIZE-ERROR ON COMPUTE' END-COMPUTE. DISPLAY 'WS-RES-VAR:' WS-RES-VAR. STOP RUN.
Output:
ERROR: SIZE-ERROR ON COMPUTE WS-RES-VAR:000
Example 2: Handling DIVIDE BY ZERO on COMPUTE verb
IDENTIFICATION DIVISION. * -----------------------* PROGRAM-ID. ERRHNDL02. AUTHOR. PROGRAMMER. DATA DIVISION. * ------------* WORKING-STORAGE SECTION. 01 WS-NUM-VAR PIC 9(02). 01 WS-RES-VAR PIC 9(03) VALUE 10. PROCEDURE DIVISION. * ------------------* COMPUTE WS-NUM-VAR = 100. COMPUTE WS-RES-VAR = 100/WS-NUM-VAR ON SIZE ERROR DISPLAY 'ERROR: DIVIDE BY ZERO CASE'. DISPLAY 'WS-NUM-VAR:' WS-NUM-VAR. DISPLAY 'WS-RES-VAR:' WS-RES-VAR. STOP RUN.
Output:
ERROR: DIVIDE BY ZERO CASE WS-NUM-VAR:00 WS-RES-VAR:010
Example 3: Handling ON SIZE ERROR on COMPUTE & ADD verb
IDENTIFICATION DIVISION.
* -----------------------*
PROGRAM-ID. ERRHNDL03.
AUTHOR. PROGRAMMER.
DATA DIVISION.
* -------------*
WORKING-STORAGE SECTION.
01 GST-VARIABLES.
05 WS-BASE-AMOUNT PIC 9(4)V9(2) VALUE 1499.99.
05 WS-GST-SPLIT-RATE PIC V99 VALUE .09.
05 WS-CGST-AMOUNT PIC 9(2)V9(2).
05 WS-SGST-AMOUNT PIC 9(2)V9(2).
05 WS-FINAL-AMOUNT PIC 9(4)V9(2).
05 WS-MESSAGE PIC X(70).
PROCEDURE DIVISION.
* ------------------*
MAINLINE-PROGRAMMING.
PERFORM CALCULATE-AFTERTAX-PARA
THRU CALCULATE-AFTERTAX-PARA-EXIT.
DISPLAY 'WS-FINAL-AMOUNT:' WS-FINAL-AMOUNT.
STOP RUN.
CALCULATE-AFTERTAX-PARA.
* ------------------*
* Calculate SGST Amount
COMPUTE WS-SGST-AMOUNT ROUNDED
= WS-BASE-AMOUNT
* WS-GST-SPLIT-RATE
ON SIZE ERROR
MOVE 'ERROR: In calculation of SGST-AMOUNT'
TO WS-MESSAGE
PERFORM HANDLE-ERROR-PARA
THRU HANDLE-ERROR-PARA-EXIT
END-COMPUTE.
* Calculate CGST Amount
COMPUTE WS-CGST-AMOUNT ROUNDED
= WS-BASE-AMOUNT
* WS-GST-SPLIT-RATE
ON SIZE ERROR
MOVE 'ERROR: In calculation of CGST-AMOUNT'
TO WS-MESSAGE
PERFORM HANDLE-ERROR-PARA
THRU HANDLE-ERROR-PARA-EXIT
END-COMPUTE.
* Calculate Final Amount
COMPUTE WS-FINAL-AMOUNT ROUNDED
= WS-BASE-AMOUNT
+ WS-CGST-AMOUNT
+ WS-SGST-AMOUNT
ON SIZE ERROR
MOVE 'ERROR: In calculation of FINAL-AMOUNT'
TO WS-MESSAGE
PERFORM HANDLE-ERROR-PARA
THRU HANDLE-ERROR-PARA-EXIT
END-COMPUTE.
CALCULATE-AFTERTAX-PARA-EXIT. EXIT.
* Handle & show error
HANDLE-ERROR-PARA.
DISPLAY WS-MESSAGE.
STOP RUN.
HANDLE-ERROR-PARA-EXIT. EXIT.
Output:
ERROR: In calculation of SGST-AMOUNT
Error Handling via phrases
COBOL does not automatically take corrective action when file input or output operation fails. The user should choose whether the program will continue or fail when an I-O error occurs. The techniques below are used for handling specific input or output conditions or errors –
- AT END and NOT AT END – Handling end of file or beginning of file condition for COBOL verbs.
1. READ filename NEXT RECORD AT END 2. READ filename PRIOR RECORD AT END 3. READ filename FIRST RECORD AT END 4. READ filename LAST RECORD AT END 5. RETURN filename AT END 6. SEARCH identifier AT END 7. WRITE filename(printer) AT EOP
- INVALID KEY and NOT INVALID KEY – Handling record not found for COBOL verbs.
1. DELETE filename INVALID KEY 2. READ filename RECORD INVALID KEY 3. REWRITE filename INVALID KEY 4. START filename KEY >= EXTERNALLY DESCRIBED KEY INVALID KEY 5. WRITE filename INVALID KEY
- NO LOCK – Handling locks for COBOL verbs.
1. DELETE filename and REWRITE filename fails as last READ operation specified NO LOCK 2. READ filename NO LOCK 3. START filename NO LOCK
String Operations Error Handling
During the STRING and UNSTRING verbs operations the result string length may fall outside the size of the receiving variable. This causes string truncation and does not notify the user. The ON OVERFLOW phase is used to handle the overflow condition and notify the end user about it.
Example 1: ON OVERFLOW in STRING
IDENTIFICATION DIVISION.
* -----------------------*
PROGRAM-ID. ERRHNDL11.
AUTHOR. PROGRAMMER.
DATA DIVISION.
* ------------*
WORKING-STORAGE SECTION.
01 WS-PART1 PIC X(05) VALUE 'HELLO'.
01 WS-PART2 PIC X(05) VALUE 'WORLD'.
01 WS-STRING PIC X(08).
PROCEDURE DIVISION.
* ------------------*
STRING WS-PART1 DELIMITED BY SIZE
WS-PART2 DELIMITED BY SIZE
INTO WS-STRING
ON OVERFLOW
DISPLAY 'ERROR: STRING OVERFLOW OCCURED!'
END-STRING.
DISPLAY 'WS-STRING: ' WS-STRING.
STOP RUN.
Output:
ERROR: STRING OVERFLOW OCCURED! WS-STRING: HELLOWOR
Note: Error occurred WS-LOCATION-BIN is truncated but OVERFLOW clause does not work properly.
Example 2: ON OVERFLOW in UNSTRING
IDENTIFICATION DIVISION.
* -----------------------*
PROGRAM-ID. ERRHNDL12.
AUTHOR. PROGRAMMER.
DATA DIVISION.
* ------------*
WORKING-STORAGE SECTION.
01 WS-ORDER-STATUS-DETAIL PIC X(100).
01 WS-ORDER-ID PIC X(07).
01 WS-ORDER-LIN-NBR PIC 9(02).
01 WS-PRODUCT-ID PIC X(08).
01 WS-QUANTITY-ORDERED PIC X(08).
01 WS-LOCATION-BIN PIC X(10).
01 WS-PICKING-STATUS PIC X(10).
01 WS-SHIPPED-DATE PIC X(10).
PROCEDURE DIVISION.
* ------------------*
MOVE 'ORD1001;2;PD-7818;5;W1ZBA15R02L04P;Pending;'
TO WS-ORDER-STATUS-DETAIL
UNSTRING WS-ORDER-STATUS-DETAIL
DELIMITED BY ';'
INTO WS-ORDER-ID,
WS-ORDER-LIN-NBR,
WS-ORDER-LIN-NBR,
WS-PRODUCT-ID,
WS-QUANTITY-ORDERED,
WS-LOCATION-BIN,
WS-PICKING-STATUS,
WS-SHIPPED-DATE
ON OVERFLOW
DISPLAY 'WARNING: UNSTRING OPERATION FAILED!'
NOT ON OVERFLOW
DISPLAY 'SUCCESSFUL!'
END-UNSTRING.
DISPLAY 'WS-ORDER-ID :' WS-ORDER-ID.
DISPLAY 'WS-ORDER-LIN-NBR :' WS-ORDER-LIN-NBR.
DISPLAY 'WS-PRODUCT-ID :' WS-PRODUCT-ID.
DISPLAY 'WS-QUANTITY-ORDERED:' WS-QUANTITY-ORDERED.
DISPLAY 'WS-LOCATION-BIN :' WS-LOCATION-BIN.
DISPLAY 'WS-PICKING-STATUS :' WS-PICKING-STATUS.
DISPLAY 'WS-SHIPPED-DATE :' WS-SHIPPED-DATE.
STOP RUN.
Output:
SUCCESSFUL! WS-ORDER-ID :ORD1001 WS-ORDER-LIN-NBR :02 WS-PRODUCT-ID :PD-7818 WS-QUANTITY-ORDERED:5 WS-LOCATION-BIN :W1ZBA15R02 WS-PICKING-STATUS :Pending WS-SHIPPED-DATE :
Note: WS-LOCATION-BIN is truncated but OVERFLOW clause does not work correctly in UNSTRING verb.
Example 3: ON OVERFLOW in UNSTRING
IDENTIFICATION DIVISION.
* -----------------------*
PROGRAM-ID. ERRHNDL12.
AUTHOR. PROGRAMMER.
DATA DIVISION.
* ------------*
WORKING-STORAGE SECTION.
01 WS-ORDER-STATUS-DETAIL PIC X(100).
01 WS-ORDER-ID PIC X(07).
01 WS-ORDER-LIN-NBR PIC 9(02).
01 WS-PRODUCT-ID PIC X(08).
01 WS-QUANTITY-ORDERED PIC X(08).
01 WS-LOCATION-BIN PIC X(10).
01 WS-PICKING-STATUS PIC X(10).
01 WS-SHIPPED-DATE PIC X(10).
PROCEDURE DIVISION.
* ------------------*
MOVE 'ORD1001;2;PD-7818;5;W1ZBA15R02;Pending;06-06-2025;'
TO WS-ORDER-STATUS-DETAIL
UNSTRING WS-ORDER-STATUS-DETAIL
DELIMITED BY ';'
INTO WS-ORDER-ID,
WS-ORDER-LIN-NBR,
WS-ORDER-LIN-NBR,
WS-PRODUCT-ID,
WS-QUANTITY-ORDERED,
WS-LOCATION-BIN,
WS-PICKING-STATUS,
WS-SHIPPED-DATE
ON OVERFLOW
DISPLAY 'WARNING: UNSTRING OPERATION FAILED!'
NOT ON OVERFLOW
DISPLAY 'SUCCESSFUL!'
END-UNSTRING.
DISPLAY 'WS-ORDER-ID :' WS-ORDER-ID.
DISPLAY 'WS-ORDER-LIN-NBR :' WS-ORDER-LIN-NBR.
DISPLAY 'WS-PRODUCT-ID :' WS-PRODUCT-ID.
DISPLAY 'WS-QUANTITY-ORDERED:' WS-QUANTITY-ORDERED.
DISPLAY 'WS-LOCATION-BIN :' WS-LOCATION-BIN.
DISPLAY 'WS-PICKING-STATUS :' WS-PICKING-STATUS.
DISPLAY 'WS-SHIPPED-DATE :' WS-SHIPPED-DATE.
STOP RUN.
Output:
WARNING: UNSTRING OPERATION FAILED! WS-ORDER-ID :ORD1001 WS-ORDER-LIN-NBR :02 WS-PRODUCT-ID :PD-7818 WS-QUANTITY-ORDERED:5 WS-LOCATION-BIN :W1ZBA15R02 WS-PICKING-STATUS :Pending WS-SHIPPED-DATE :06-06-2025
Note: UNSTRING operation failed as string as extra semi-colon.
CALL Operations Error Handling
In ILE COBOL programs, programmers use CALL statements for:
- Calling a subprogram – (Object Type – *PGM, Attribute – CBL or CBLLE)
- Calling an external API programs like QCMDEXC. (Object Type – *PGM, Attribute – CBL)
- Calling internal procedures in NOMONOPRC.
- Calling statis or dynamic call.
ON EXCEPTION phrase handles few errors at run time. ON OVERFLOW phrase with CALL verb works similar as ‘EXCEPTION’.
Example 1: CALL (Handling error MCH3401 – Cannot resolve object ‘ABC’ & ‘XYZ’.)
PROCESS APOST.
IDENTIFICATION DIVISION.
*-----------------------*
PROGRAM-ID. ERRHNDL31.
AUTHOR. PROGRAMMER.
DATA DIVISION.
*--------------*
01 WS-PGM-NAME PIC X(10) VALUE 'XYZ'.
PROCEDURE DIVISION.
*-------------------*
MAIN-LOGIC.
* Call 'ABC' program
CALL 'ABC'
ON EXCEPTION
DISPLAY 'ERROR IN CALL - ABC'.
* Call 'XYZ' program
CALL WS-PGM-NAME
ON EXCEPTION
DISPLAY 'ERROR IN CALL - XYZ'.
STOP RUN.
Output:
ERROR IN CALL – ABC ERROR IN CALL – XYZ
►Since, ABC & XYZ – *PGM object was not present in *LIBL.
►This works well for – object types – *PGM, Attribute – CBL, CBLLE, CLP or CLLE.
Example 2: Handling error MCH0801 – Argument associated with external or internal parameters not passed.
PROCESS APOST. IDENTIFICATION DIVISION. *-----------------------* PROGRAM-ID. ERRHNDL32. AUTHOR. PROGRAMMER. DATA DIVISION. *--------------* 01 WS-PGM-NAME PIC X(10) VALUE 'ABC02'. PROCEDURE DIVISION. *-------------------* MAIN-LOGIC. * Call program 'ABC02' - MCH0801 * ------------------------------ CALL 'ABC02' ON EXCEPTION DISPLAY 'ERROR IN CALL - ABC02'. STOP RUN.
Program: ABC02
IDENTIFICATION DIVISION. *-----------------------* PROGRAM-ID. ABC02. AUTHOR. PROGRAMMER. DATA DIVISION. *--------------* LINKAGE SECTION. 01 LK-PARM1 PIC X(02). PROCEDURE DIVISION USING LK-PARM1. *-------------------* MAIN-LOGIC. DISPLAY "LK-PARM1:" LK-PARM1. STOP RUN.
Output
ERROR IN CALL - ABC02.
►Since, no parameter has been passed for ABC02.
► This works well for – object types – *PGM, Attribute – CBL, CBLLE, CLP or CLLE.
Example 3: CALL (Handling error MCH0802 – Total parameters passed do not match the number required.)
PROCESS APOST.
IDENTIFICATION DIVISION.
*-----------------------*
PROGRAM-ID. ERRHNDL33.
AUTHOR. PROGRAMMER.
DATA DIVISION.
*--------------*
01 WS-PARM1 PIC X(05) VALUE 'QWERT'.
01 WS-PARM2 PIC X(05) VALUE 'OPERT'.
PROCEDURE DIVISION.
*-------------------*
MAIN-LOGIC.
* Call program 'ABC01' - MCH0802
* ------------------------------
CALL 'ABC01' USING WS-PARM1
ON EXCEPTION
DISPLAY 'ERROR IN CALL - ABC01'.
STOP RUN.
Program: ABC01
IDENTIFICATION DIVISION.
*-----------------------*
PROGRAM-ID. ABC01.
AUTHOR. PROGRAMMER.
DATA DIVISION.
*--------------*
LINKAGE SECTION.
01 LK-PARM1 PIC X(05).
01 LK-PARM2 PIC X(05).
PROCEDURE DIVISION.
*-------------------*
MAIN-LOGIC.
DISPLAY "LK-PARM1:" LK-PARM1.
DISPLAY "LK-PARM2:" LK-PARM2.
STOP RUN.
Output
ERROR IN CALL - ABC01.
► There is a mismatch in number of parameters when ABC02 program is called.
► This works well for – object types – *PGM, attribute – CBL or CBLLE.
► This does not work well for – object types – *PGM, attribute – CL or CLLE.