HANDLE CONDITION


The HANDLE CONDITION command is used to manage specific conditions that may arise during execution. It represents a control passing label or paragraph to be executed if a defined condition occurs.

It is important to execute the HANDLE CONDITION command before the command that could trigger the condition. Additionally, users can specify up to 16 conditions in a single HANDLE CONDITION command.

  • The HANDLE CONDITION command is only applicable to the specific program in which it is defined.
  • If another HANDLE CONDITION command for the same condition is coded, the new command will override the previous one.
  • HANDLE CONDITION options are applicable to the program where they are coded.

Why?

  • Prevents unexpected transaction failures by handling predictable errors.
  • Redirects execution to a user-defined error-handling section.
  • Improves debugging by capturing and logging error details before terminating execution.

Key Features -

  • Intercepts and handles specific error conditions instead of crashing the program.
  • Transfers control to an error-handling routine when an error occurs.
  • Only affects the conditions specified in the command.
  • Multiple conditions can be handled in a single program.
  • Can be disabled using the IGNORE or NOHANDLE option if needed.

Syntax -

EXEC CICS HANDLE CONDITION
     ERROR-CODE(LABEL)
     [ERROR-CODE2(LABEL2) ...]
     END-EXEC.
  • ERROR-CODE - Specifies the CICS condition to handle (e.g., NOTFND, INVREQ). Common Error Codes -
    • NOTFND - Record not found in a VSAM file or DB2 table.
    • INVREQ - Invalid request made to CICS.
    • ILLOGIC - Logical error detected in VSAM file operations.
    • ITEMERR - Item requested in a queue or storage area does not exist.
    • DUPKEY - A duplicate key was found while inserting a record.
    • QIDERR - An invalid queue ID was used in a TS or TD queue.
  • LABEL - Specifies the paragraph or section to which control is transferred if the error occurs.

Short Examples -


Scenario1 - Handling Record Not Found (NOTFND)

...
PROCEDURE DIVISION.

    EXEC CICS HANDLE CONDITION
         NOTFND(ERROR-HANDLER)
         END-EXEC.
		 
    EXEC CICS READ
         DATASET('CUSTFILE')
         INTO(WS-DATA)
         RESP(WS-RESP)
         END-EXEC.

    IF WS-RESP NOT = 0 THEN
       ...
	END-IF.

ERROR-HANDLER.
    MOVE "ERROR: Record not found in CUSTOMER-FILE "
	  TO ERROR-MSG1.
    
    EXEC CICS RETURN
         END-EXEC.

When the record is not found during the file read, the control transfers to the ERROR-HANDLER paragraph.

Scenario2 - Handling Multiple Error Conditions

...
PROCEDURE DIVISION.

    EXEC CICS HANDLE CONDITION
         DUPKEY(DUPLICATE-KEY-HANDLER)
         INVREQ(INVALID-REQUEST-HANDLER)
         END-EXEC.
		 
    EXEC CICS WRITE
         DATASET('CUSTFILE')
         FROM(WS-RECORD)
         RESP(WS-RESP)
         END-EXEC.

    IF WS-RESP NOT = 0 THEN
       ...
	END-IF.

DUPLICATE-KEY-HANDLER.
    MOVE "ERROR: Duplicate key detected"
	  TO ERROR-MSG1
    EXEC CICS RETURN
		END-EXEC.

INVALID-REQUEST-HANDLER.
    MOVE "ERROR: Invalid request made to CICS"
	  TO ERROR-MSG1
    EXEC CICS RETURN 
		END-EXEC.

When the record is already in the file during the file write, the control transfers to the DUPLICATE-KEY-HANDLER paragraph. If the file write request is invaid, then control transfers to INVALID-REQUEST-HANDLER paragraph.