Error recovery in COBOL involves detecting, handling, and recovering from errors that occur during program execution. Effective error recovery ensures programs handle errors gracefully, provide meaningful error messages, attempt recovery when possible, and terminate cleanly when recovery isn't possible. Error recovery is essential for robust, production-quality COBOL programs that must operate reliably in enterprise environments.
This comprehensive guide will teach you how to handle file errors using FILE STATUS, detect arithmetic errors with ON SIZE ERROR, implement error recovery strategies, log errors effectively, and follow best practices for robust error handling. Whether you're handling file I/O errors, arithmetic exceptions, or data validation failures, mastering error recovery is crucial for building reliable COBOL applications.
Error recovery encompasses:
File errors are handled by checking FILE STATUS after file operations. FILE STATUS is a two-character field that indicates the result of file operations.
1234567891011121314ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INPUT-FILE ASSIGN TO "INPUT.DAT" ORGANIZATION IS SEQUENTIAL FILE STATUS IS FILE-STATUS-CODE. DATA DIVISION. FILE SECTION. FD INPUT-FILE. 01 INPUT-RECORD PIC X(100). WORKING-STORAGE SECTION. 01 FILE-STATUS-CODE PIC X(2).
FILE STATUS is defined in FILE-CONTROL with FILE STATUS IS status-field-name. Check it after each file operation.
123456789101112131415161718192021222324252627282930313233343536PROCEDURE DIVISION. MAIN-LOGIC. OPEN INPUT INPUT-FILE IF FILE-STATUS-CODE NOT = "00" DISPLAY "ERROR: File open failed. Status: " FILE-STATUS-CODE PERFORM HANDLE-FILE-ERROR STOP RUN END-IF PERFORM UNTIL FILE-STATUS-CODE = "10" READ INPUT-FILE AT END CONTINUE NOT AT END IF FILE-STATUS-CODE = "00" PERFORM PROCESS-RECORD ELSE DISPLAY "ERROR: Read failed. Status: " FILE-STATUS-CODE PERFORM HANDLE-READ-ERROR END-IF END-READ END-PERFORM CLOSE INPUT-FILE STOP RUN. HANDLE-FILE-ERROR. EVALUATE FILE-STATUS-CODE WHEN "30" DISPLAY "Permanent error - file cannot be accessed" WHEN "35" DISPLAY "File not found" WHEN OTHER DISPLAY "Unknown file error: " FILE-STATUS-CODE END-EVALUATE.
Always check FILE STATUS after file operations. Status "00" means success, other values indicate errors.
| Status Code | Meaning | Typical Action |
|---|---|---|
| "00" | Successful completion | Continue processing |
| "02" | Duplicate key (indexed files) | Handle duplicate or skip |
| "04" | Record length mismatch | Check record structure |
| "10" | End of file | Normal condition, stop reading |
| "22" | Duplicate key | Handle duplicate key error |
| "23" | Record not found | Handle missing record |
| "30" | Permanent error | Cannot recover, terminate |
| "35" | File not found | Check file existence |
Arithmetic errors are handled using ON SIZE ERROR for overflow detection and explicit checks for division by zero.
1234567891011121314151617181920212223WORKING-STORAGE SECTION. 01 AMOUNT-1 PIC 9(5) VALUE 99999. 01 AMOUNT-2 PIC 9(5) VALUE 1. 01 RESULT PIC 9(5). 01 ERROR-FLAG PIC X(1) VALUE 'N'. 88 ERROR-OCCURRED VALUE 'Y'. PROCEDURE DIVISION. MAIN-LOGIC. ADD AMOUNT-1 TO AMOUNT-2 GIVING RESULT ON SIZE ERROR DISPLAY "ERROR: Arithmetic overflow" SET ERROR-OCCURRED TO TRUE MOVE 99999 TO RESULT *> Set to maximum value END-ADD IF ERROR-OCCURRED DISPLAY "Result capped at maximum: " RESULT ELSE DISPLAY "Result: " RESULT END-IF STOP RUN.
ON SIZE ERROR detects when the result of an arithmetic operation is too large to fit in the target field. Handle overflow gracefully.
1234567891011121314151617181920WORKING-STORAGE SECTION. 01 DIVIDEND PIC 9(5) VALUE 1000. 01 DIVISOR PIC 9(5) VALUE 0. 01 QUOTIENT PIC 9(5). PROCEDURE DIVISION. MAIN-LOGIC. IF DIVISOR = 0 DISPLAY "ERROR: Division by zero not allowed" MOVE 0 TO QUOTIENT ELSE DIVIDE DIVIDEND BY DIVISOR GIVING QUOTIENT ON SIZE ERROR DISPLAY "ERROR: Division result overflow" MOVE 0 TO QUOTIENT END-DIVIDE END-IF DISPLAY "Quotient: " QUOTIENT STOP RUN.
Always check for division by zero before DIVIDE operations. Handle the error appropriately.
Common error recovery strategies:
1234567891011121314151617181920212223242526WORKING-STORAGE SECTION. 01 RETRY-COUNT PIC 9(2) VALUE 0. 01 MAX-RETRIES PIC 9(2) VALUE 3. 01 FILE-STATUS-CODE PIC X(2). PROCEDURE DIVISION. MAIN-LOGIC. PERFORM UNTIL FILE-STATUS-CODE = "00" OR RETRY-COUNT >= MAX-RETRIES ADD 1 TO RETRY-COUNT OPEN INPUT INPUT-FILE IF FILE-STATUS-CODE NOT = "00" DISPLAY "Open attempt " RETRY-COUNT " failed. Status: " FILE-STATUS-CODE IF RETRY-COUNT < MAX-RETRIES DISPLAY "Retrying in 1 second..." *> Wait before retry (implementation-specific) END-IF ELSE DISPLAY "File opened successfully on attempt " RETRY-COUNT END-IF END-PERFORM IF FILE-STATUS-CODE NOT = "00" DISPLAY "ERROR: Could not open file after " MAX-RETRIES " attempts" STOP RUN END-IF.
1234567891011121314151617181920212223242526272829PROCEDURE DIVISION. MAIN-LOGIC. OPEN INPUT INPUT-FILE PERFORM UNTIL FILE-STATUS-CODE = "10" READ INPUT-FILE AT END CONTINUE NOT AT END IF FILE-STATUS-CODE = "00" PERFORM VALIDATE-RECORD IF RECORD-IS-VALID PERFORM PROCESS-RECORD ELSE ADD 1 TO INVALID-RECORD-COUNT DISPLAY "Skipping invalid record" END-IF ELSE ADD 1 TO ERROR-COUNT DISPLAY "Read error. Status: " FILE-STATUS-CODE DISPLAY "Skipping record and continuing" END-IF END-READ END-PERFORM CLOSE INPUT-FILE DISPLAY "Processing complete. Errors: " ERROR-COUNT " Invalid records: " INVALID-RECORD-COUNT STOP RUN.
Log errors with sufficient detail for diagnosis:
1234567891011121314151617181920WORKING-STORAGE SECTION. 01 ERROR-LOG-RECORD. 05 ERROR-TYPE PIC X(20). 05 ERROR-CODE PIC X(10). 05 ERROR-MESSAGE PIC X(100). 05 ERROR-TIMESTAMP PIC X(14). 05 ERROR-CONTEXT PIC X(50). PROCEDURE DIVISION. LOG-ERROR. *> Get current date/time ACCEPT ERROR-TIMESTAMP FROM DATE YYYYMMDD ACCEPT ERROR-TIMESTAMP(9:6) FROM TIME *> Write to error log file WRITE ERROR-LOG-RECORD *> Also display for immediate visibility DISPLAY "ERROR [" ERROR-TIMESTAMP "]: " ERROR-TYPE " Code: " ERROR-CODE " " ERROR-MESSAGE.
Include in error logs: error type, error code, descriptive message, timestamp, and context information.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103IDENTIFICATION DIVISION. PROGRAM-ID. ERROR-RECOVERY-EXAMPLE. AUTHOR. MainframeMaster Tutorial. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INPUT-FILE ASSIGN TO "INPUT.DAT" ORGANIZATION IS SEQUENTIAL FILE STATUS IS FILE-STATUS. SELECT ERROR-LOG ASSIGN TO "ERRORLOG.DAT" ORGANIZATION IS SEQUENTIAL FILE STATUS IS ERROR-LOG-STATUS. DATA DIVISION. FILE SECTION. FD INPUT-FILE. 01 INPUT-RECORD PIC X(100). FD ERROR-LOG. 01 ERROR-RECORD PIC X(200). WORKING-STORAGE SECTION. 01 FILE-STATUS PIC X(2). 01 ERROR-LOG-STATUS PIC X(2). 01 RECORD-COUNT PIC 9(6) VALUE 0. 01 ERROR-COUNT PIC 9(6) VALUE 0. 01 SUCCESS-COUNT PIC 9(6) VALUE 0. PROCEDURE DIVISION. MAIN-LOGIC. DISPLAY "=== Error Recovery Example ===" PERFORM OPEN-FILES IF FILE-STATUS = "00" PERFORM PROCESS-FILE PERFORM CLOSE-FILES ELSE DISPLAY "FATAL: Cannot open input file. Status: " FILE-STATUS END-IF DISPLAY "Processing complete:" DISPLAY " Records processed: " RECORD-COUNT DISPLAY " Successful: " SUCCESS-COUNT DISPLAY " Errors: " ERROR-COUNT STOP RUN. OPEN-FILES. OPEN INPUT INPUT-FILE IF FILE-STATUS NOT = "00" PERFORM LOG-ERROR EXIT PARAGRAPH END-IF OPEN OUTPUT ERROR-LOG IF ERROR-LOG-STATUS NOT = "00" DISPLAY "WARNING: Cannot open error log. Status: " ERROR-LOG-STATUS END-IF. PROCESS-FILE. PERFORM UNTIL FILE-STATUS = "10" READ INPUT-FILE AT END CONTINUE NOT AT END ADD 1 TO RECORD-COUNT IF FILE-STATUS = "00" PERFORM PROCESS-RECORD ELSE ADD 1 TO ERROR-COUNT PERFORM HANDLE-READ-ERROR END-IF END-READ END-PERFORM. PROCESS-RECORD. *> Process record with error handling *> Example: arithmetic operation *> (Implementation would include actual processing) ADD 1 TO SUCCESS-COUNT. HANDLE-READ-ERROR. DISPLAY "ERROR: Read failed. Status: " FILE-STATUS PERFORM LOG-ERROR *> Continue processing - skip and continue strategy. LOG-ERROR. *> Log error to file and display DISPLAY "Error logged: Status " FILE-STATUS *> (Implementation would write to error log file). CLOSE-FILES. CLOSE INPUT-FILE IF FILE-STATUS NOT = "00" DISPLAY "WARNING: Error closing input file. Status: " FILE-STATUS END-IF CLOSE ERROR-LOG IF ERROR-LOG-STATUS NOT = "00" DISPLAY "WARNING: Error closing error log. Status: " ERROR-LOG-STATUS END-IF.
This complete example demonstrates comprehensive error recovery with file status checking, error logging, and skip-and-continue strategy.
Think of error recovery like fixing mistakes:
So error recovery is like having a plan for when things go wrong - you notice the problem, try to fix it, and if you can't, you handle it gracefully!
1. What is FILE STATUS used for?
2. What FILE STATUS code indicates successful completion?
3. What is ON SIZE ERROR used for?
4. What FILE STATUS code indicates end of file?
5. What should you do after a file operation?
6. What is a common error recovery strategy?
7. What should error logs include?
8. When should you use ON SIZE ERROR?