COBOL handling a divide-by-zero condition
The program in the following example registers a user-written condition
handler, calls the DIVZERO subroutine, and unregisters the condition
handler on return from the subroutine.
CBL LIB,QUOTE,NODYNAM,NOOPT
*Module/File Name: IGZTDIVZ
******************************************************
* *
* EXCOND .-> DIVZERO *
* - register handler | - force a divide-by-zero *
* - call DIVZERO --' *
* ==> "resume point" *
* - unregister handler *
* USRHDLR *
* - if divide-by-zero, then: *
* - move resume cursor *
* - resume at "resume point" *
* *
******************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. EXCOND.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 DIVISOR PIC S9(9) BINARY.
**
** Declarations for condition handling
**
77 TOKEN PIC X(4).
77 PGMPTR USAGE IS PROCEDURE-POINTER.
01 FC.
02 Condition-Token-Value.
COPY CEEIGZCT.
03 Case-1-Condition-ID.
04 Severity PIC S9(4) BINARY.
04 Msg-No PIC S9(4) BINARY.
03 Case-2-Condition-ID
REDEFINES Case-1-Condition-ID.
04 Class-Code PIC S9(4) BINARY.
04 Cause-Code PIC S9(4) BINARY.
03 Case-Sev-Ctl PIC X.
03 Facility-ID PIC XXX.
02 I-S-Info PIC S9(9) BINARY.
PROCEDURE DIVISION.
PARA-CND01A.
************************************************
** Register a user-written condition handler. **
************************************************
SET PGMPTR TO ENTRY "USRHDLR".
MOVE ZERO TO TOKEN.
CALL "CEEHDLR" USING PGMPTR TOKEN FC.
IF CEE000 of FC THEN
DISPLAY "EXCOND: REGISTERED USRHDLR."
ELSE
DISPLAY "CEEHDLR failed with msg "
Msg-No of FC UPON CONSOLE
STOP RUN
END-IF.
**************************************************************
** Call DIVZERO to force a divide-by-zero and drive USRHDLR **
**************************************************************
MOVE 00 TO DIVISOR.
CALL "DIVZERO" USING DIVISOR.
DISPLAY "EXCOND: RESUMED AFTER DIVZERO.".
***************************************************
** Unregister the user-written condition handler.**
***************************************************
CALL "CEEHDLU" USING PGMPTR FC.
IF CEE000 of FC THEN
DISPLAY "EXCOND: UNREGISTERED USRHDLR."
ELSE
DISPLAY "CEEHDLU failed with msg "
Msg-No of FC UPON CONSOLE
STOP RUN
END-IF.
GOBACK.
END PROGRAM EXCOND.
Figure 1 shows the subroutine DIVZERO that generates the divide-by-zero condition.
Figure 1. DIVZERO program
(COBOL)
CBL LIB,QUOTE,NODYNAM,NOOPT
*Module/File Name: IGZTDIVS
IDENTIFICATION DIVISION.
PROGRAM-ID. DIVZERO.
DATA DIVISION.
LINKAGE SECTION.
01 ARG PIC S9(9) BINARY.
PROCEDURE DIVISION USING ARG.
DISPLAY " DIVZERO: STARTING.".
COMPUTE ARG = 1 / ARG.
DISPLAY " DIVZERO: RETURNING TO ITS CALLER.".
GOBACK.
END PROGRAM DIVZERO.