To identify the user-written RPG IV subroutine that is to receive control
when a program exception/error occurs, specify *PSSR in factor 1 of the subroutine's
BEGSR operation. If an indicator is not specified in positions 73 and 74
for the operation code, or if the operation does not have
an (E) extender, or if the statement is not in a MONITOR block that can handle
the error, or if an exception occurs that is not expected for the operation
code (that is, an array indexing error during a SCAN operation), control
is transferred to this subroutine when a program exception/error occurs.
In addition, the subroutine can also be called by the EXSR operation. *PSSR
can be specified on the INFSR keyword on the file description specifications
and receives control if a file exception/error occurs.
Any of the RPG IV operation codes can be used in the program exception/error
subroutine. The ENDSR operation must be the last specification for the subroutine,
and the factor 2 entry on the ENDSR operation specifies the return point
following the running of the subroutine. For a discussion of the valid entries
for factor 2, see File Exception/Error Subroutine (INFSR).
Remember the following when specifying a program exception/error subroutine:
You can explicitly call the *PSSR subroutine by specifying *PSSR in factor
2 of the EXSR operation.
After the ENDSR operation of the *PSSR subroutine is run, the RPG IV
language resets the field, subfield, or array element specified in factor
2 to blanks. This allows you to specify the return point within the subroutine
that is best suited for the exception/error that occurred. If factor 2 contains
blanks at the end of the subroutine, the RPG IV default error handler receives
control; if the subroutine was called by an EXSR or CASxx operation, control
returns to the next sequential instruction following the EXSR or ENDCS.
Because the program exception/error subroutine may receive control whenever
a non-file exception/error occurs, an exception/error could occur while the
subroutine is running. If an exception/error occurs while the subroutine
is running, the subroutine is called again; this will result in a program
loop unless the programmer codes the subroutine to avoid this problem.
If you have used the OPTIMIZE(*FULL) option on either the CRTBNDRPG or
the CRTRPGMOD command, you have to declare all fields that you refer to during
exception handling with the NOOPT keyword in the definition specification
for the field. This will ensure that when you run your program, the fields
referred to during exception handling will have current values.
A *PSSR can be defined in a subprocedure, and each subprocedure can have
its own *PSSR. Note that the *PSSR in a subprocedure is local to that subprocedure.
If you want the subprocedures to share the same exception routine then you
should have each *PSSR call a shared procedure.