The DECLARATIVES section in COBOL contains special procedures that are automatically executed when specific conditions occur, providing centralized exception handling and special processing capabilities.
123456789101112131415161718192021PROCEDURE DIVISION. DECLARATIVES. section-name SECTION. USE statement. paragraph-name. statements... section-name-2 SECTION. USE statement. paragraph-name-2. statements... END DECLARATIVES. *> Regular procedure division code follows MAIN-SECTION SECTION. MAIN-PROCESSING. statements...
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768PROCEDURE DIVISION. DECLARATIVES. file-error-section SECTION. USE AFTER STANDARD ERROR PROCEDURE ON INPUT-FILE. file-error-handler. DISPLAY "Error occurred on INPUT-FILE" DISPLAY "File Status: " FILE-STATUS-INPUT EVALUATE FILE-STATUS-INPUT WHEN "10" DISPLAY "End of file reached" MOVE "Y" TO EOF-FLAG WHEN "23" DISPLAY "Record not found" MOVE "Y" TO RECORD-NOT-FOUND-FLAG WHEN "24" DISPLAY "Boundary violation" PERFORM ERROR-RECOVERY WHEN OTHER DISPLAY "Unexpected file error: " FILE-STATUS-INPUT PERFORM ABEND-PROCESSING END-EVALUATE. general-error-section SECTION. USE AFTER STANDARD ERROR PROCEDURE ON OUTPUT-FILE, REPORT-FILE. general-error-handler. DISPLAY "Error on file: " IF FILE-STATUS-OUTPUT NOT = "00" DISPLAY "OUTPUT-FILE Status: " FILE-STATUS-OUTPUT END-IF IF FILE-STATUS-REPORT NOT = "00" DISPLAY "REPORT-FILE Status: " FILE-STATUS-REPORT END-IF PERFORM LOG-ERROR-DETAILS. END DECLARATIVES. MAIN-SECTION SECTION. MAIN-PROCESSING. OPEN INPUT INPUT-FILE OPEN OUTPUT OUTPUT-FILE, REPORT-FILE PERFORM READ-AND-PROCESS UNTIL EOF-FLAG = "Y" CLOSE INPUT-FILE, OUTPUT-FILE, REPORT-FILE STOP RUN. READ-AND-PROCESS. READ INPUT-FILE AT END MOVE "Y" TO EOF-FLAG NOT AT END PERFORM PROCESS-RECORD END-READ. ERROR-RECOVERY. DISPLAY "Attempting error recovery..." *> Recovery logic here ABEND-PROCESSING. DISPLAY "Fatal error - terminating program" MOVE 16 TO RETURN-CODE STOP RUN. LOG-ERROR-DETAILS. *> Log error to audit file or system log CONTINUE.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-ERROR-HANDLING. 05 WS-ERROR-COUNT PIC 9(3) VALUE ZERO. 05 WS-MAX-ERRORS PIC 9(3) VALUE 10. 05 WS-RETRY-COUNT PIC 9(2) VALUE ZERO. 05 WS-MAX-RETRIES PIC 9(2) VALUE 3. 05 WS-ERROR-LOG-FILE PIC X(20) VALUE "ERROR.LOG". 01 WS-ERROR-DETAILS. 05 WS-ERROR-TIMESTAMP PIC X(20). 05 WS-ERROR-FILE-NAME PIC X(30). 05 WS-ERROR-STATUS PIC X(2). 05 WS-ERROR-OPERATION PIC X(10). PROCEDURE DIVISION. DECLARATIVES. comprehensive-error-section SECTION. USE AFTER STANDARD ERROR PROCEDURE ON ALL FILES. comprehensive-error-handler. ADD 1 TO WS-ERROR-COUNT ACCEPT WS-ERROR-TIMESTAMP FROM DATE-TIME *> Determine which file caused the error PERFORM IDENTIFY-ERROR-FILE *> Log the error PERFORM LOG-COMPREHENSIVE-ERROR *> Determine recovery action PERFORM DETERMINE-ERROR-ACTION. END DECLARATIVES. MAIN-SECTION SECTION. IDENTIFY-ERROR-FILE. *> Check file status of all files to identify the problem IF FILE-STATUS-CUSTOMER NOT = "00" MOVE "CUSTOMER-FILE" TO WS-ERROR-FILE-NAME MOVE FILE-STATUS-CUSTOMER TO WS-ERROR-STATUS ELSE IF FILE-STATUS-ORDERS NOT = "00" MOVE "ORDERS-FILE" TO WS-ERROR-FILE-NAME MOVE FILE-STATUS-ORDERS TO WS-ERROR-STATUS ELSE IF FILE-STATUS-REPORTS NOT = "00" MOVE "REPORTS-FILE" TO WS-ERROR-FILE-NAME MOVE FILE-STATUS-REPORTS TO WS-ERROR-STATUS END-IF. LOG-COMPREHENSIVE-ERROR. DISPLAY "=== FILE ERROR DETECTED ===" DISPLAY "Timestamp: " WS-ERROR-TIMESTAMP DISPLAY "File: " WS-ERROR-FILE-NAME DISPLAY "Status: " WS-ERROR-STATUS DISPLAY "Error Count: " WS-ERROR-COUNT DISPLAY "==========================" *> Write to error log file PERFORM WRITE-ERROR-LOG. DETERMINE-ERROR-ACTION. EVALUATE WS-ERROR-STATUS WHEN "10" *> End of file CONTINUE WHEN "23" *> Record not found IF WS-RETRY-COUNT < WS-MAX-RETRIES ADD 1 TO WS-RETRY-COUNT DISPLAY "Retrying operation..." ELSE DISPLAY "Max retries exceeded" PERFORM SKIP-RECORD-PROCESSING END-IF WHEN "30" *> Permanent error DISPLAY "Permanent error - cannot continue" PERFORM EMERGENCY-SHUTDOWN WHEN OTHER IF WS-ERROR-COUNT > WS-MAX-ERRORS DISPLAY "Too many errors - aborting" PERFORM EMERGENCY-SHUTDOWN ELSE DISPLAY "Continuing with next operation" END-IF END-EVALUATE. WRITE-ERROR-LOG. *> Write detailed error information to log file CONTINUE. SKIP-RECORD-PROCESSING. *> Skip current record and continue CONTINUE. EMERGENCY-SHUTDOWN. DISPLAY "Emergency shutdown initiated" MOVE 20 TO RETURN-CODE STOP RUN.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768PROCEDURE DIVISION. DECLARATIVES. report-control-section SECTION. USE BEFORE REPORTING PAGE-HEADING. page-heading-control. ADD 1 TO PAGE-COUNTER ACCEPT CURRENT-DATE-TIME FROM DATE-TIME MOVE CURRENT-DATE-TIME(1:8) TO REPORT-DATE MOVE CURRENT-DATE-TIME(9:6) TO REPORT-TIME DISPLAY "Generating page " PAGE-COUNTER. summary-control-section SECTION. USE BEFORE REPORTING FINAL-SUMMARY. final-summary-control. COMPUTE AVERAGE-AMOUNT = TOTAL-AMOUNT / RECORD-COUNT MOVE AVERAGE-AMOUNT TO AVERAGE-DISPLAY DISPLAY "Final summary being generated" DISPLAY "Total records processed: " RECORD-COUNT DISPLAY "Average amount: " AVERAGE-DISPLAY. END DECLARATIVES. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-COUNTERS. 05 PAGE-COUNTER PIC 9(3) VALUE ZERO. 05 RECORD-COUNT PIC 9(5) VALUE ZERO. 05 TOTAL-AMOUNT PIC 9(8)V99 VALUE ZERO. 05 AVERAGE-AMOUNT PIC 9(6)V99. 01 WS-DATE-TIME-FIELDS. 05 CURRENT-DATE-TIME PIC X(20). 05 REPORT-DATE PIC X(8). 05 REPORT-TIME PIC X(6). 01 WS-DISPLAY-FIELDS. 05 AVERAGE-DISPLAY PIC ZZ,ZZ9.99. REPORT SECTION. RD SALES-REPORT CONTROL IS FINAL, REGION. 01 PAGE-HEADING TYPE IS PAGE HEADING. 05 LINE 1. 05 COLUMN 1 PIC X(20) VALUE "SALES REPORT". 05 COLUMN 50 PIC X(8) SOURCE REPORT-DATE. 05 COLUMN 60 PIC X(6) SOURCE REPORT-TIME. 05 COLUMN 70 PIC X(5) VALUE "PAGE ". 05 COLUMN 75 PIC ZZ9 SOURCE PAGE-COUNTER. 01 DETAIL-LINE TYPE IS DETAIL. 05 LINE PLUS 1. 05 COLUMN 1 PIC X(10) SOURCE SALESMAN-ID. 05 COLUMN 15 PIC X(20) SOURCE CUSTOMER-NAME. 05 COLUMN 40 PIC ZZ,ZZ9.99 SOURCE SALE-AMOUNT. 01 FINAL-SUMMARY TYPE IS CONTROL FOOTING FINAL. 05 LINE PLUS 3. 05 COLUMN 1 PIC X(15) VALUE "TOTAL RECORDS: ". 05 COLUMN 20 PIC ZZ,ZZ9 SOURCE RECORD-COUNT. 05 LINE PLUS 1. 05 COLUMN 1 PIC X(15) VALUE "AVERAGE AMOUNT: ". 05 COLUMN 20 PIC ZZ,ZZ9.99 SOURCE AVERAGE-DISPLAY.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081PROCEDURE DIVISION. DECLARATIVES. region-break-section SECTION. USE BEFORE REPORTING REGION-FOOTING. region-break-processing. *> Calculate region statistics IF REGION-RECORD-COUNT > 0 COMPUTE REGION-AVERAGE = REGION-TOTAL / REGION-RECORD-COUNT ELSE MOVE ZERO TO REGION-AVERAGE END-IF *> Determine performance rating EVALUATE TRUE WHEN REGION-TOTAL > 100000 MOVE "EXCELLENT" TO REGION-RATING WHEN REGION-TOTAL > 50000 MOVE "GOOD" TO REGION-RATING WHEN REGION-TOTAL > 25000 MOVE "AVERAGE" TO REGION-RATING WHEN OTHER MOVE "BELOW AVG" TO REGION-RATING END-EVALUATE *> Log region completion DISPLAY "Region " REGION-CODE " completed:" DISPLAY " Records: " REGION-RECORD-COUNT DISPLAY " Total: " REGION-TOTAL DISPLAY " Average: " REGION-AVERAGE DISPLAY " Rating: " REGION-RATING. page-overflow-section SECTION. USE BEFORE REPORTING PAGE-FOOTING. page-overflow-processing. *> Check if page is getting full IF LINE-COUNTER > 50 DISPLAY "Page " PAGE-COUNTER " is full - starting new page" ADD 1 TO TOTAL-PAGES END-IF *> Add page footer information ACCEPT CURRENT-TIME FROM TIME MOVE CURRENT-TIME TO PAGE-TIME. END DECLARATIVES. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-REGION-STATS. 05 REGION-RECORD-COUNT PIC 9(4) VALUE ZERO. 05 REGION-TOTAL PIC 9(8)V99 VALUE ZERO. 05 REGION-AVERAGE PIC 9(6)V99. 05 REGION-RATING PIC X(10). 01 WS-PAGE-CONTROL. 05 TOTAL-PAGES PIC 9(3) VALUE ZERO. 05 LINE-COUNTER PIC 9(2) VALUE ZERO. 05 CURRENT-TIME PIC X(8). 05 PAGE-TIME PIC X(8). REPORT SECTION. RD REGIONAL-SALES-REPORT CONTROL IS FINAL, REGION-CODE. 01 REGION-FOOTING TYPE IS CONTROL FOOTING REGION-CODE. 05 LINE PLUS 2. 05 COLUMN 1 PIC X(15) VALUE "REGION TOTAL: ". 05 COLUMN 20 PIC ZZ,ZZ9.99 SOURCE REGION-TOTAL. 05 COLUMN 35 PIC X(10) VALUE "AVERAGE: ". 05 COLUMN 45 PIC Z,ZZ9.99 SOURCE REGION-AVERAGE. 05 COLUMN 55 PIC X(10) VALUE "RATING: ". 05 COLUMN 65 PIC X(10) SOURCE REGION-RATING. 01 PAGE-FOOTING TYPE IS PAGE FOOTING. 05 LINE 60. 05 COLUMN 1 PIC X(20) VALUE "End of Page". 05 COLUMN 50 PIC X(8) SOURCE PAGE-TIME.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100PROCEDURE DIVISION. DECLARATIVES. exception-handling-section SECTION. USE AFTER STANDARD EXCEPTION PROCEDURE. exception-handler. DISPLAY "Exception occurred in program" DISPLAY "Exception type: " EXCEPTION-TYPE DISPLAY "Exception location: " EXCEPTION-LOCATION PERFORM LOG-EXCEPTION-DETAILS PERFORM DETERMINE-EXCEPTION-ACTION. arithmetic-exception-section SECTION. USE AFTER STANDARD EXCEPTION PROCEDURE ON ARITHMETIC-OPERATIONS. arithmetic-exception-handler. DISPLAY "Arithmetic exception detected" EVALUATE EXCEPTION-TYPE WHEN "DIVIDE-BY-ZERO" DISPLAY "Division by zero attempted" PERFORM HANDLE-DIVIDE-BY-ZERO WHEN "OVERFLOW" DISPLAY "Arithmetic overflow occurred" PERFORM HANDLE-OVERFLOW WHEN "SIZE-ERROR" DISPLAY "Size error in arithmetic operation" PERFORM HANDLE-SIZE-ERROR WHEN OTHER DISPLAY "Unknown arithmetic exception" PERFORM HANDLE-UNKNOWN-ARITHMETIC-ERROR END-EVALUATE. END DECLARATIVES. MAIN-SECTION SECTION. LOG-EXCEPTION-DETAILS. ACCEPT EXCEPTION-TIMESTAMP FROM DATE-TIME DISPLAY "=== EXCEPTION LOG ===" DISPLAY "Time: " EXCEPTION-TIMESTAMP DISPLAY "Type: " EXCEPTION-TYPE DISPLAY "Location: " EXCEPTION-LOCATION DISPLAY "Program: " PROGRAM-NAME DISPLAY "====================" *> Write to exception log file PERFORM WRITE-EXCEPTION-LOG. DETERMINE-EXCEPTION-ACTION. EVALUATE EXCEPTION-SEVERITY WHEN "FATAL" DISPLAY "Fatal exception - terminating" PERFORM CLEANUP-AND-EXIT WHEN "ERROR" DISPLAY "Error exception - attempting recovery" PERFORM ATTEMPT-RECOVERY WHEN "WARNING" DISPLAY "Warning exception - continuing" CONTINUE WHEN OTHER DISPLAY "Unknown exception severity" PERFORM ATTEMPT-RECOVERY END-EVALUATE. HANDLE-DIVIDE-BY-ZERO. DISPLAY "Setting result to zero for divide-by-zero" MOVE ZERO TO CALCULATION-RESULT ADD 1 TO DIVIDE-BY-ZERO-COUNT. HANDLE-OVERFLOW. DISPLAY "Using maximum value for overflow" MOVE HIGH-VALUES TO CALCULATION-RESULT ADD 1 TO OVERFLOW-COUNT. HANDLE-SIZE-ERROR. DISPLAY "Truncating result for size error" MOVE 999999999 TO CALCULATION-RESULT ADD 1 TO SIZE-ERROR-COUNT. HANDLE-UNKNOWN-ARITHMETIC-ERROR. DISPLAY "Setting default value for unknown error" MOVE ZERO TO CALCULATION-RESULT ADD 1 TO UNKNOWN-ERROR-COUNT. WRITE-EXCEPTION-LOG. *> Write exception details to log file CONTINUE. ATTEMPT-RECOVERY. DISPLAY "Attempting automatic recovery..." *> Recovery logic here CONTINUE. CLEANUP-AND-EXIT. DISPLAY "Performing cleanup operations..." *> Cleanup logic here MOVE 24 TO RETURN-CODE STOP RUN.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263*> Standard DECLARATIVES template PROCEDURE DIVISION. DECLARATIVES. *> File error handling template file-error-section SECTION. USE AFTER STANDARD ERROR PROCEDURE ON file-name. file-error-handler. PERFORM LOG-FILE-ERROR PERFORM DETERMINE-FILE-ACTION. *> Report processing template report-section SECTION. USE BEFORE REPORTING report-group-name. report-handler. PERFORM SETUP-REPORT-DATA PERFORM CALCULATE-REPORT-TOTALS. *> Debug processing template debug-section SECTION. USE FOR DEBUGGING ON ALL PROCEDURES. debug-handler. IF DEBUG-MODE-ON PERFORM LOG-DEBUG-INFO END-IF. *> Exception handling template exception-section SECTION. USE AFTER STANDARD EXCEPTION PROCEDURE. exception-handler. PERFORM LOG-EXCEPTION PERFORM HANDLE-EXCEPTION. END DECLARATIVES. *> Standard procedures for declaratives MAIN-SECTION SECTION. LOG-FILE-ERROR. DISPLAY "File error: " FILE-STATUS *> Log to error file or system log DETERMINE-FILE-ACTION. EVALUATE FILE-STATUS WHEN "10" CONTINUE *> End of file WHEN "23" PERFORM RETRY-OPERATION WHEN OTHER PERFORM ABORT-PROCESSING END-EVALUATE. LOG-DEBUG-INFO. DISPLAY "Debug: " DEBUG-LINE " " DEBUG-NAME. LOG-EXCEPTION. DISPLAY "Exception: " EXCEPTION-TYPE. HANDLE-EXCEPTION. EVALUATE EXCEPTION-TYPE WHEN "FATAL" PERFORM EMERGENCY-EXIT WHEN OTHER PERFORM CONTINUE-PROCESSING END-EVALUATE.