The ON
keyword in COBOL serves multiple purposes, primarily in exception handling and conditional processing. It's used to specify actions to be taken when certain conditions occur, such as size errors in arithmetic operations, overflow conditions, or invalid key situations in file operations. It's also used in the OCCURS DEPENDING ON clause for variable table definitions.
Handle arithmetic overflow conditions
Handle string operation overflow
Handle file operation key errors
Define variable table dimensions
ADD WS-NUM-1 TO WS-RESULT ON SIZE ERROR DISPLAY "ARITHMETIC OVERFLOW OCCURRED" MOVE ZERO TO WS-RESULT NOT ON SIZE ERROR DISPLAY "ADDITION SUCCESSFUL" END-ADD. MULTIPLY WS-FACTOR BY WS-VALUE ON SIZE ERROR DISPLAY "MULTIPLICATION OVERFLOW" SET WS-ERROR-FLAG TO TRUE END-MULTIPLY.
Handling size errors in arithmetic operations.
DIVIDE WS-DIVIDEND BY WS-DIVISOR GIVING WS-QUOTIENT REMAINDER WS-REMAINDER ON SIZE ERROR DISPLAY "DIVISION ERROR - POSSIBLE DIVIDE BY ZERO" MOVE ZERO TO WS-QUOTIENT MOVE ZERO TO WS-REMAINDER NOT ON SIZE ERROR DISPLAY "QUOTIENT: " WS-QUOTIENT DISPLAY "REMAINDER: " WS-REMAINDER END-DIVIDE.
Division with size error handling and remainder calculation.
COMPUTE WS-RESULT = (WS-A * WS-B) + (WS-C / WS-D) ON SIZE ERROR DISPLAY "COMPLEX CALCULATION OVERFLOW" PERFORM ERROR-HANDLING-ROUTINE NOT ON SIZE ERROR DISPLAY "CALCULATION RESULT: " WS-RESULT END-COMPUTE.
Using ON SIZE ERROR with complex COMPUTE statements.
STRING WS-FIRST-NAME DELIMITED BY SPACE " " DELIMITED BY SIZE WS-LAST-NAME DELIMITED BY SPACE INTO WS-FULL-NAME WITH POINTER WS-STRING-POINTER ON OVERFLOW DISPLAY "STRING TOO LONG FOR TARGET FIELD" MOVE "NAME TRUNCATED" TO WS-ERROR-MESSAGE NOT ON OVERFLOW DISPLAY "FULL NAME: " WS-FULL-NAME END-STRING.
Handling overflow in STRING operations.
UNSTRING WS-INPUT-DATA DELIMITED BY "," OR ";" INTO WS-FIELD-1 WS-FIELD-2 WS-FIELD-3 WS-FIELD-4 WS-FIELD-5 WITH POINTER WS-DATA-POINTER TALLYING IN WS-FIELD-COUNT ON OVERFLOW DISPLAY "TOO MANY FIELDS IN INPUT DATA" DISPLAY "MAXIMUM 5 FIELDS SUPPORTED" NOT ON OVERFLOW DISPLAY "PARSED " WS-FIELD-COUNT " FIELDS" END-UNSTRING.
Handling overflow in UNSTRING operations when too many delimited fields exist.
READ CUSTOMER-FILE INVALID KEY DISPLAY "CUSTOMER NOT FOUND: " WS-CUSTOMER-ID SET WS-RECORD-NOT-FOUND TO TRUE NOT INVALID KEY DISPLAY "CUSTOMER FOUND: " CUSTOMER-NAME SET WS-RECORD-FOUND TO TRUE END-READ. WRITE CUSTOMER-RECORD INVALID KEY DISPLAY "DUPLICATE KEY ERROR" PERFORM DUPLICATE-KEY-HANDLING NOT INVALID KEY DISPLAY "RECORD ADDED SUCCESSFULLY" ADD 1 TO WS-RECORDS-ADDED END-WRITE.
Handling invalid key conditions in file operations.
REWRITE CUSTOMER-RECORD INVALID KEY DISPLAY "RECORD NOT FOUND FOR UPDATE" PERFORM RECORD-NOT-FOUND-ERROR NOT INVALID KEY DISPLAY "RECORD UPDATED SUCCESSFULLY" ADD 1 TO WS-RECORDS-UPDATED END-REWRITE. DELETE CUSTOMER-FILE RECORD INVALID KEY DISPLAY "RECORD NOT FOUND FOR DELETION" SET WS-DELETE-FAILED TO TRUE NOT INVALID KEY DISPLAY "RECORD DELETED" ADD 1 TO WS-RECORDS-DELETED END-DELETE.
Using INVALID KEY with REWRITE and DELETE operations.
01 TRANSACTION-RECORD. 05 TRANS-COUNT PIC 99. 05 TRANSACTION-DATA OCCURS 1 TO 50 TIMES DEPENDING ON TRANS-COUNT. 10 TRANS-ID PIC X(10). 10 TRANS-AMOUNT PIC 9(7)V99. 10 TRANS-DATE PIC 9(8). 01 STUDENT-GRADES. 05 COURSE-COUNT PIC 99. 05 GRADE-DATA OCCURS 1 TO 20 TIMES DEPENDING ON COURSE-COUNT. 10 COURSE-CODE PIC X(8). 10 GRADE-VALUE PIC 999. 10 CREDIT-HOURS PIC 99. PROCEDURE DIVISION. MOVE 5 TO TRANS-COUNT. MOVE 12 TO COURSE-COUNT. PERFORM VARYING WS-INDEX FROM 1 BY 1 UNTIL WS-INDEX > TRANS-COUNT MOVE WS-INDEX TO TRANS-ID (WS-INDEX) END-PERFORM.
Using OCCURS DEPENDING ON for variable-length tables.
CALL "EXTERNAL-PROGRAM" USING WS-INPUT-PARAMETER WS-OUTPUT-PARAMETER ON EXCEPTION DISPLAY "PROGRAM CALL FAILED" DISPLAY "PROGRAM MAY NOT BE AVAILABLE" SET WS-CALL-FAILED TO TRUE NOT ON EXCEPTION DISPLAY "PROGRAM CALLED SUCCESSFULLY" SET WS-CALL-SUCCESSFUL TO TRUE END-CALL. CALL WS-DYNAMIC-PROGRAM USING WS-PARAMETERS ON EXCEPTION DISPLAY "DYNAMIC CALL FAILED FOR: " WS-DYNAMIC-PROGRAM PERFORM ALTERNATIVE-PROCESSING END-CALL.
Handling exceptions in CALL statements.
PERFORM CALCULATE-COMMISSION ON SIZE ERROR DISPLAY "COMMISSION CALCULATION OVERFLOW" PERFORM DEFAULT-COMMISSION-ROUTINE END-PERFORM. CALCULATE-COMMISSION. MULTIPLY WS-SALES-AMOUNT BY WS-COMMISSION-RATE GIVING WS-COMMISSION ON SIZE ERROR DISPLAY "BASIC COMMISSION OVERFLOW" MOVE ZERO TO WS-COMMISSION EXIT PARAGRAPH END-MULTIPLY. ADD WS-BONUS-AMOUNT TO WS-COMMISSION ON SIZE ERROR DISPLAY "BONUS ADDITION OVERFLOW" SUBTRACT WS-BONUS-AMOUNT FROM WS-COMMISSION END-ADD.
Handling multiple levels of error conditions.
PROCESS-CUSTOMER-UPDATE. READ CUSTOMER-FILE INVALID KEY DISPLAY "CUSTOMER NOT FOUND: " WS-CUSTOMER-ID GO TO PROCESS-CUSTOMER-UPDATE-EXIT END-READ. COMPUTE WS-NEW-BALANCE = WS-OLD-BALANCE + WS-TRANSACTION-AMOUNT ON SIZE ERROR DISPLAY "BALANCE CALCULATION OVERFLOW" MOVE WS-OLD-BALANCE TO WS-NEW-BALANCE END-COMPUTE. MOVE WS-NEW-BALANCE TO CUSTOMER-BALANCE. REWRITE CUSTOMER-RECORD INVALID KEY DISPLAY "UPDATE FAILED - RECORD CHANGED" PERFORM RECORD-CONFLICT-RESOLUTION END-REWRITE. PROCESS-CUSTOMER-UPDATE-EXIT. EXIT.
Combining multiple ON conditions in a single operation.
WORKING-STORAGE SECTION. 01 WS-ERROR-LOG. 05 WS-ERROR-COUNT PIC 999 VALUE ZERO. 05 WS-ERROR-DETAILS OCCURS 100 TIMES. 10 WS-ERROR-TYPE PIC X(20). 10 WS-ERROR-TIME PIC X(8). 10 WS-ERROR-DESC PIC X(50). PROCEDURE DIVISION. DIVIDE WS-TOTAL-SALES BY WS-CUSTOMER-COUNT GIVING WS-AVERAGE-SALE ON SIZE ERROR ADD 1 TO WS-ERROR-COUNT MOVE "SIZE ERROR" TO WS-ERROR-TYPE (WS-ERROR-COUNT) ACCEPT WS-ERROR-TIME (WS-ERROR-COUNT) FROM TIME MOVE "DIVISION OVERFLOW IN AVERAGE CALCULATION" TO WS-ERROR-DESC (WS-ERROR-COUNT) MOVE ZERO TO WS-AVERAGE-SALE END-DIVIDE.
Logging errors for audit and debugging purposes.
Condition | When It Occurs | Typical Response |
---|---|---|
ON SIZE ERROR | Arithmetic result exceeds field size | Set to maximum value or zero |
ON OVERFLOW | String operation exceeds target field | Truncate or use larger field |
ON INVALID KEY | File record key not found | Skip operation or create record |
ON EXCEPTION | Program call fails | Use alternative processing |
Specifies actions when conditions do NOT occur
Terminates conditional statement blocks
Table definitions using DEPENDING ON
General error and exception management