EXCEPTION handling represents a fundamental component of robust application development in COBOL, serving as the comprehensive framework for detecting, managing, and recovering from error conditions during program execution. This mechanism embodies defensive programming principles by providing systematic error detection capabilities, enabling sophisticated exception management processes, and supporting the development of resilient applications that can gracefully handle unexpected conditions while maintaining data integrity and operational continuity.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372IDENTIFICATION DIVISION. PROGRAM-ID. EXCEPTION-HANDLING-COMPREHENSIVE. DATA DIVISION. WORKING-STORAGE SECTION. 01 EXCEPTION-MANAGEMENT-SYSTEM. 05 EXCEPTION-STATUS PIC X VALUE 'N'. 88 EXCEPTION-OCCURRED VALUE 'Y'. 88 NO-EXCEPTION VALUE 'N'. 05 EXCEPTION-CODE PIC 9(6) VALUE 0. 05 EXCEPTION-MESSAGE PIC X(100). 05 EXCEPTION-SEVERITY PIC X(8). 88 SEVERITY-INFO VALUE 'INFO'. 88 SEVERITY-WARNING VALUE 'WARNING'. 88 SEVERITY-ERROR VALUE 'ERROR'. 88 SEVERITY-CRITICAL VALUE 'CRITICAL'. 05 EXCEPTION-TIMESTAMP PIC X(14). 05 EXCEPTION-LOCATION PIC X(30). 01 CALL-EXCEPTION-HANDLING. 05 PROGRAM-NAME PIC X(8) VALUE 'SUBPROG1'. 05 CALL-STATUS PIC X VALUE 'N'. 88 CALL-SUCCESS VALUE 'Y'. 88 CALL-FAILED VALUE 'N'. 05 CALL-PARAMETERS. 10 PARAM-INPUT PIC X(20). 10 PARAM-OUTPUT PIC X(50). 10 PARAM-RETURN-CODE PIC 9(4). 01 FILE-EXCEPTION-HANDLING. 05 FILE-STATUS-CODE PIC XX. 88 FILE-SUCCESS VALUE '00'. 88 FILE-EOF VALUE '10'. 88 FILE-NOT-FOUND VALUE '35'. 88 FILE-ACCESS-DENIED VALUE '37'. 88 FILE-DISK-FULL VALUE '34'. 05 FILE-OPERATION PIC X(10). 05 FILE-NAME PIC X(30). 01 ARITHMETIC-EXCEPTION-HANDLING. 05 ARITHMETIC-RESULT PIC 9(9)V99. 05 DIVIDEND PIC 9(7)V99 VALUE 1000.00. 05 DIVISOR PIC 9(5)V99 VALUE 0. 05 CALCULATION-STATUS PIC X VALUE 'N'. 88 CALC-SUCCESS VALUE 'Y'. 88 CALC-ERROR VALUE 'N'. 01 EXCEPTION-STATISTICS. 05 TOTAL-EXCEPTIONS PIC 9(7) VALUE 0. 05 CALL-EXCEPTIONS PIC 9(5) VALUE 0. 05 FILE-EXCEPTIONS PIC 9(5) VALUE 0. 05 ARITHMETIC-EXCEPTIONS PIC 9(5) VALUE 0. 05 CUSTOM-EXCEPTIONS PIC 9(5) VALUE 0. 05 RECOVERED-EXCEPTIONS PIC 9(5) VALUE 0. 05 UNRECOVERED-EXCEPTIONS PIC 9(5) VALUE 0. PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM INITIALIZE-EXCEPTION-SYSTEM PERFORM DEMONSTRATE-CALL-EXCEPTION-HANDLING PERFORM DEMONSTRATE-FILE-EXCEPTION-HANDLING PERFORM DEMONSTRATE-ARITHMETIC-EXCEPTION-HANDLING PERFORM DEMONSTRATE-CUSTOM-EXCEPTION-HANDLING PERFORM DISPLAY-EXCEPTION-STATISTICS STOP RUN. INITIALIZE-EXCEPTION-SYSTEM. DISPLAY 'Initializing comprehensive exception handling system...' SET NO-EXCEPTION TO TRUE MOVE 0 TO EXCEPTION-CODE MOVE SPACES TO EXCEPTION-MESSAGE SET SEVERITY-INFO TO TRUE MOVE FUNCTION CURRENT-DATE TO EXCEPTION-TIMESTAMP DISPLAY 'Exception handling system ready'. DEMONSTRATE-CALL-EXCEPTION-HANDLING. DISPLAY 'Demonstrating CALL exception handling...' MOVE 'INPUT-DATA' TO PARAM-INPUT MOVE SPACES TO PARAM-OUTPUT MOVE 0 TO PARAM-RETURN-CODE CALL PROGRAM-NAME USING CALL-PARAMETERS ON EXCEPTION SET EXCEPTION-OCCURRED TO TRUE MOVE 1001 TO EXCEPTION-CODE STRING 'CALL exception for program: ' DELIMITED BY SIZE PROGRAM-NAME DELIMITED BY SPACE INTO EXCEPTION-MESSAGE END-STRING SET SEVERITY-ERROR TO TRUE MOVE 'CALL-EXCEPTION' TO EXCEPTION-LOCATION ADD 1 TO CALL-EXCEPTIONS PERFORM HANDLE-CALL-EXCEPTION NOT ON EXCEPTION SET CALL-SUCCESS TO TRUE DISPLAY 'CALL to ' PROGRAM-NAME ' completed successfully' DISPLAY 'Return code: ' PARAM-RETURN-CODE DISPLAY 'Output: ' PARAM-OUTPUT END-CALL. HANDLE-CALL-EXCEPTION. DISPLAY 'Handling CALL exception...' PERFORM LOG-EXCEPTION EVALUATE EXCEPTION-CODE WHEN 1001 DISPLAY 'Program not found - attempting alternative' PERFORM ATTEMPT-ALTERNATIVE-PROGRAM WHEN OTHER DISPLAY 'Unknown CALL exception' PERFORM ESCALATE-EXCEPTION END-EVALUATE. ATTEMPT-ALTERNATIVE-PROGRAM. MOVE 'SUBPROG2' TO PROGRAM-NAME DISPLAY 'Attempting alternative program: ' PROGRAM-NAME CALL PROGRAM-NAME USING CALL-PARAMETERS ON EXCEPTION DISPLAY 'Alternative program also failed' ADD 1 TO UNRECOVERED-EXCEPTIONS NOT ON EXCEPTION DISPLAY 'Alternative program succeeded' ADD 1 TO RECOVERED-EXCEPTIONS END-CALL. DEMONSTRATE-FILE-EXCEPTION-HANDLING. DISPLAY 'Demonstrating file exception handling...' MOVE 'NONEXIST.DAT' TO FILE-NAME MOVE 'OPEN' TO FILE-OPERATION *> Simulate file operation with exception handling MOVE '35' TO FILE-STATUS-CODE *> File not found PERFORM PROCESS-FILE-EXCEPTION IF EXCEPTION-OCCURRED PERFORM HANDLE-FILE-EXCEPTION END-IF. PROCESS-FILE-EXCEPTION. EVALUATE FILE-STATUS-CODE WHEN '00' SET NO-EXCEPTION TO TRUE DISPLAY 'File operation successful: ' FILE-OPERATION WHEN '35' SET EXCEPTION-OCCURRED TO TRUE MOVE 2001 TO EXCEPTION-CODE STRING 'File not found: ' DELIMITED BY SIZE FILE-NAME DELIMITED BY SPACE ' during ' DELIMITED BY SIZE FILE-OPERATION DELIMITED BY SPACE INTO EXCEPTION-MESSAGE END-STRING SET SEVERITY-ERROR TO TRUE MOVE 'FILE-OPERATION' TO EXCEPTION-LOCATION ADD 1 TO FILE-EXCEPTIONS WHEN '37' SET EXCEPTION-OCCURRED TO TRUE MOVE 2002 TO EXCEPTION-CODE STRING 'Access denied: ' DELIMITED BY SIZE FILE-NAME DELIMITED BY SPACE INTO EXCEPTION-MESSAGE END-STRING SET SEVERITY-ERROR TO TRUE MOVE 'FILE-OPERATION' TO EXCEPTION-LOCATION ADD 1 TO FILE-EXCEPTIONS WHEN '34' SET EXCEPTION-OCCURRED TO TRUE MOVE 2003 TO EXCEPTION-CODE MOVE 'Disk full during file operation' TO EXCEPTION-MESSAGE SET SEVERITY-CRITICAL TO TRUE MOVE 'FILE-OPERATION' TO EXCEPTION-LOCATION ADD 1 TO FILE-EXCEPTIONS WHEN OTHER SET EXCEPTION-OCCURRED TO TRUE MOVE 2999 TO EXCEPTION-CODE STRING 'Unknown file error: ' DELIMITED BY SIZE FILE-STATUS-CODE DELIMITED BY SIZE INTO EXCEPTION-MESSAGE END-STRING SET SEVERITY-ERROR TO TRUE MOVE 'FILE-OPERATION' TO EXCEPTION-LOCATION ADD 1 TO FILE-EXCEPTIONS END-EVALUATE. HANDLE-FILE-EXCEPTION. DISPLAY 'Handling file exception...' PERFORM LOG-EXCEPTION EVALUATE EXCEPTION-CODE WHEN 2001 DISPLAY 'Attempting to create missing file' PERFORM CREATE-MISSING-FILE WHEN 2002 DISPLAY 'Checking alternative file locations' PERFORM CHECK-ALTERNATIVE-LOCATIONS WHEN 2003 DISPLAY 'Critical disk space issue' PERFORM ESCALATE-EXCEPTION WHEN OTHER DISPLAY 'General file error recovery' PERFORM ATTEMPT-FILE-RECOVERY END-EVALUATE. CREATE-MISSING-FILE. DISPLAY 'Creating missing file: ' FILE-NAME *> Implementation would create the file ADD 1 TO RECOVERED-EXCEPTIONS DISPLAY 'File created successfully'. CHECK-ALTERNATIVE-LOCATIONS. DISPLAY 'Checking alternative file locations...' *> Implementation would check backup locations ADD 1 TO RECOVERED-EXCEPTIONS DISPLAY 'Alternative location found'. ATTEMPT-FILE-RECOVERY. DISPLAY 'Attempting file recovery procedures...' *> Implementation would attempt recovery ADD 1 TO RECOVERED-EXCEPTIONS DISPLAY 'File recovery completed'. DEMONSTRATE-ARITHMETIC-EXCEPTION-HANDLING. DISPLAY 'Demonstrating arithmetic exception handling...' PERFORM SAFE-DIVISION-WITH-EXCEPTION-HANDLING PERFORM SAFE-MULTIPLICATION-WITH-EXCEPTION-HANDLING. SAFE-DIVISION-WITH-EXCEPTION-HANDLING. DISPLAY 'Performing safe division with exception handling...' COMPUTE ARITHMETIC-RESULT = DIVIDEND / DIVISOR ON SIZE ERROR SET EXCEPTION-OCCURRED TO TRUE MOVE 3001 TO EXCEPTION-CODE STRING 'Division error: ' DELIMITED BY SIZE DIVIDEND DELIMITED BY SIZE ' / ' DELIMITED BY SIZE DIVISOR DELIMITED BY SIZE INTO EXCEPTION-MESSAGE END-STRING SET SEVERITY-ERROR TO TRUE MOVE 'ARITHMETIC-OPERATION' TO EXCEPTION-LOCATION ADD 1 TO ARITHMETIC-EXCEPTIONS PERFORM HANDLE-ARITHMETIC-EXCEPTION NOT ON SIZE ERROR SET CALC-SUCCESS TO TRUE DISPLAY 'Division result: ' ARITHMETIC-RESULT END-COMPUTE. SAFE-MULTIPLICATION-WITH-EXCEPTION-HANDLING. DISPLAY 'Performing safe multiplication with exception handling...' MOVE 999999 TO DIVIDEND MOVE 999999 TO DIVISOR COMPUTE ARITHMETIC-RESULT = DIVIDEND * DIVISOR ON SIZE ERROR SET EXCEPTION-OCCURRED TO TRUE MOVE 3002 TO EXCEPTION-CODE STRING 'Multiplication overflow: ' DELIMITED BY SIZE DIVIDEND DELIMITED BY SIZE ' * ' DELIMITED BY SIZE DIVISOR DELIMITED BY SIZE INTO EXCEPTION-MESSAGE END-STRING SET SEVERITY-WARNING TO TRUE MOVE 'ARITHMETIC-OPERATION' TO EXCEPTION-LOCATION ADD 1 TO ARITHMETIC-EXCEPTIONS PERFORM HANDLE-ARITHMETIC-EXCEPTION NOT ON SIZE ERROR SET CALC-SUCCESS TO TRUE DISPLAY 'Multiplication result: ' ARITHMETIC-RESULT END-COMPUTE. HANDLE-ARITHMETIC-EXCEPTION. DISPLAY 'Handling arithmetic exception...' PERFORM LOG-EXCEPTION EVALUATE EXCEPTION-CODE WHEN 3001 DISPLAY 'Division by zero - using default value' MOVE 0 TO ARITHMETIC-RESULT ADD 1 TO RECOVERED-EXCEPTIONS WHEN 3002 DISPLAY 'Overflow - using maximum value' MOVE 999999999.99 TO ARITHMETIC-RESULT ADD 1 TO RECOVERED-EXCEPTIONS WHEN OTHER DISPLAY 'Unknown arithmetic error' ADD 1 TO UNRECOVERED-EXCEPTIONS END-EVALUATE. DEMONSTRATE-CUSTOM-EXCEPTION-HANDLING. DISPLAY 'Demonstrating custom exception handling...' PERFORM VALIDATE-BUSINESS-RULES-WITH-EXCEPTIONS PERFORM HANDLE-CUSTOM-BUSINESS-EXCEPTIONS. VALIDATE-BUSINESS-RULES-WITH-EXCEPTIONS. DISPLAY 'Validating business rules...' *> Simulate business rule validation SET EXCEPTION-OCCURRED TO TRUE MOVE 4001 TO EXCEPTION-CODE MOVE 'Business rule violation: Customer age exceeds maximum' TO EXCEPTION-MESSAGE SET SEVERITY-WARNING TO TRUE MOVE 'BUSINESS-VALIDATION' TO EXCEPTION-LOCATION ADD 1 TO CUSTOM-EXCEPTIONS. HANDLE-CUSTOM-BUSINESS-EXCEPTIONS. IF EXCEPTION-OCCURRED DISPLAY 'Handling custom business exception...' PERFORM LOG-EXCEPTION EVALUATE EXCEPTION-CODE WHEN 4001 DISPLAY 'Applying business rule override' PERFORM APPLY-BUSINESS-OVERRIDE WHEN OTHER DISPLAY 'Unknown business exception' PERFORM ESCALATE-EXCEPTION END-EVALUATE END-IF. APPLY-BUSINESS-OVERRIDE. DISPLAY 'Applying business rule override...' ADD 1 TO RECOVERED-EXCEPTIONS DISPLAY 'Business rule override applied successfully'. LOG-EXCEPTION. ADD 1 TO TOTAL-EXCEPTIONS MOVE FUNCTION CURRENT-DATE TO EXCEPTION-TIMESTAMP DISPLAY 'Exception Logged:' DISPLAY 'Code: ' EXCEPTION-CODE DISPLAY 'Message: ' EXCEPTION-MESSAGE DISPLAY 'Severity: ' EXCEPTION-SEVERITY DISPLAY 'Location: ' EXCEPTION-LOCATION DISPLAY 'Timestamp: ' EXCEPTION-TIMESTAMP. ESCALATE-EXCEPTION. DISPLAY 'Escalating exception to higher level...' ADD 1 TO UNRECOVERED-EXCEPTIONS IF SEVERITY-CRITICAL DISPLAY 'Critical exception - immediate attention required' *> Could trigger alerts, notifications, etc. END-IF. DISPLAY-EXCEPTION-STATISTICS. DISPLAY 'Exception Handling Statistics:' DISPLAY '================================' DISPLAY 'Total exceptions: ' TOTAL-EXCEPTIONS DISPLAY 'CALL exceptions: ' CALL-EXCEPTIONS DISPLAY 'File exceptions: ' FILE-EXCEPTIONS DISPLAY 'Arithmetic exceptions: ' ARITHMETIC-EXCEPTIONS DISPLAY 'Custom exceptions: ' CUSTOM-EXCEPTIONS DISPLAY 'Recovered exceptions: ' RECOVERED-EXCEPTIONS DISPLAY 'Unrecovered exceptions: ' UNRECOVERED-EXCEPTIONS IF TOTAL-EXCEPTIONS > 0 COMPUTE RECOVERED-EXCEPTIONS = (RECOVERED-EXCEPTIONS / TOTAL-EXCEPTIONS) * 100 DISPLAY 'Recovery rate: ' RECOVERED-EXCEPTIONS '%' END-IF.