MainframeMaster

COBOL Tutorial

COBOL EXCEPTION Handling

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.

Comprehensive EXCEPTION Handling

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
IDENTIFICATION 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.

Best Practices and FAQ

Exception Best Practices
  • • Always use ON EXCEPTION with CALL statements
  • • Check file status codes after I/O operations
  • • Implement ON SIZE ERROR for arithmetic
  • • Create comprehensive error logging
  • • Design recovery procedures
Recovery Strategies
  • • Implement alternative processing paths
  • • Use default values for missing data
  • • Create backup file locations
  • • Implement retry mechanisms
  • • Escalate critical exceptions