ON

Overview

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.

Primary Uses

ON SIZE ERROR

Handle arithmetic overflow conditions

ON OVERFLOW

Handle string operation overflow

ON INVALID KEY

Handle file operation key errors

OCCURS DEPENDING ON

Define variable table dimensions

ON SIZE ERROR

Basic Arithmetic Operations

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.

Division 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 Statement

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.

ON OVERFLOW

STRING Statement

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 Statement

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.

ON INVALID KEY

Random File Access

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 and DELETE

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.

OCCURS DEPENDING ON

Variable Table Definition

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.

ON EXCEPTION

CALL Statement Exception Handling

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.

Complex Error Handling

Nested Exception Handling

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.

Comprehensive File Processing

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.

Error Logging and Recovery

Comprehensive Error Logging

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.

Best Practices

  • Always handle size errors in arithmetic operations that could overflow
  • Use meaningful error messages that aid in debugging
  • Provide reasonable default values when errors occur
  • Log errors for audit trails and problem analysis
  • Use NOT ON condition to confirm successful operations

Common Error Conditions

ConditionWhen It OccursTypical Response
ON SIZE ERRORArithmetic result exceeds field sizeSet to maximum value or zero
ON OVERFLOWString operation exceeds target fieldTruncate or use larger field
ON INVALID KEYFile record key not foundSkip operation or create record
ON EXCEPTIONProgram call failsUse alternative processing

Related Concepts

NOT ON

Specifies actions when conditions do NOT occur

END-VERB

Terminates conditional statement blocks

OCCURS Clause

Table definitions using DEPENDING ON

Exception Handling

General error and exception management