CICS中的异常处理有很多种情况,此处主要只针对在输入过程中的异常处理。异常处理是通过在相应的CICS命令中使用RESP选项实现的。RESP选项后为一个8位长度的有符号数,用以表明异常的种类。例如,以下代码在输入数据大于指定长度时,将对所抛出的异常进行处理。处理方式为在屏幕上输出相应提示信息。代码如下:
IDENTIFICATION DIVISION.
PROGRAM-ID. RESPGM.
*
ENVIRONMENT DIVISION.
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WKFLDS.
05 INLEN PIC S9(4) USAGE IS COMP.
05 ERR-CODE PIC S9(8) COMP.
01 INAREA.
05 DATA-1 PIC X(5).
05 FILLER PIC XX.
05 DATA-2 PIC X(5).
……
*
PROCEDURE DIVISION.
MOVE 12 TO INLEN.
EXEC CICS RECEIVE INTO(INAREA)
LENGTH(INLEN)
RESP(ERR-CODE) /*此处捕获异常*/
END-EXEC.
IF ERR-CODE = DFHRESP(LENGERR)
MOVE ‘INPUT DATA TOO LONG’ TO MSG
EXEC CICS SEND FROM(MSG)
LENGTH(20)
END-EXEC
……
EXEC CICS RETURN END-EXEC.
GOBACK.
由以上代码可以看到,判断该异常的类型实际上是通过以下代码实现的:
IF ERR-CODE = DFHRESP(LENGERR)
……
其中ERR-CODE是由用户定义的一个变量。该变量通过RESP选项可得到所抛出异常的编号。将该异常编号与CICS系统中的DFHRESP相应异常编号进行比较,便可判断出该异常的类型。除以上代码中出现的异常外,通常还有以下几种异常类型:
IF ERR-CODE = DFHRESP(TERMERR) /*终端错误异常*/
……
IF ERR-CODE = DFHRESP(EOC) /*链结束(End of Chain)异常*/
……
IF ERR-CODE = DFHRESP(ERROR) /*错误异常*/
……
IF ERR-CODE = DFHRESP(NORMAL) /*无异常*/
……
需要注意的是,DFHRESP(ERROR)异常属于一种类型的异常,并不代表全部异常。判断一条CICS命令中存在任何异常,可以使用如下方式进行:
IF ERR-CODE NOT EQUAL DFHRESP(NORMAL) /*当存在任何异常时,执行相关操作*/
……