
Example of an Error Routine
Using *ERROR-TA, USR0020N, and USR2010N
By Dieter W. Storr
Last update: 30 June 2006
Question:
How can I write a central error routine and including the long name of the error text?
Answer:
At first, all programs should have an ON ERROR statement, which uses *ERROR-TA and calling a central error routine, for example:
(snip)
1440 *
1450 ON ERROR
1460 *ERROR-TA := 'NPPERROR'
1470 END-ERROR
1480 *
(snip)
When ON ERROR block entered for execution, program is interrupted and can only be resumed with RETRY. Exit ON ERROR block with FETCH, STOP, TERMINATE, RETRY, or ESCAPE ROUTINE.
Each module of subroutine built with CALLNAT, PERFORM, or FETCH RETURN may contain an ON ERROR statement. If error occurs, Natural traces back to select first ON ERROR statement for processing; if none found, program terminates.
Applicable system variables: *ERROR-NR and *ERROR-LINE.
This system variable *ERROR-TA (A8) contains the name of the program, which is to receive control in the event of an error condition.
When an error occurs, Natural will execute a STACK TOP DATA statement and place at the top of the stack the following information, which can be used as INPUT data by an error transaction: Error number (N4 if SG=OFF; N5 if SG=ON), Line number (N4), Status (A1), Program name (A8), Level (N2). If the Status is "L", the Line number will be "0". The Status may be one of the following:
- C = Command processing error.
- L = Logon error.
- O = Object time error.
- S = Non-correctable Syntax error.
- R = Error on Remote server (in conjunction with Natural RPC).
Central Error Routine
The central error routine, for example NPPERROR, receives the error information from the stack via *ERROR-TA by using the statement "INPUT ERR-NR ERR-LINE ERR-STAT ERR-PGM ERR-LVL." It can be used from online and batch and reads additional information with USR0020N (error text) and USR2010N (DB error information).
* NAT-PAD Program Administration and Documentation
*
* NPPERROR: NAT-PAD Central Error Routine
*
* Input: ERR-NR ERR-LINE ERR-STAT ERR-PGM ERR-LVL
* Subroutine: CALLNAT 'USR0020N' PARM-AREA RETURN-AREA
* CALLNAT 'USR2010N' DB_ERR_STR
*
* Date Name Change and Enhancements
* --------------------------------------------------------------------
* 10/31/1998 D.Storr data base information user exit USR0610N
* DB_DBID and DB_FNR from B1 to B2
* 03/18/1999 D.Storr Back to B1 - Georg Schmitt SAG-DA:
* For 2 byte DBID,FNR please use USR2010N.
* 03/23/1999 D.Storr Changed USR0610N to USR2010N
*
* ------------------------(C) www.storrconsulting.com ----------
*
DEFINE DATA
LOCAL
1 ERR-NR (N4)
1 ERR-LINE (N4)
1 ERR-STAT (A1)
1 ERR-PGM (A8)
1 ERR-LVL (N2)
1 INFO (A78)
*
1 PARM-AREA /* Parameters for CALLNAT
2 TYPE (A1) /* U or N ( User or NATURAL messages )
2 APPLICATION (A8) /* Must not be blank for type = 'U'
2 #ERROR-NUMBER (N4) /* 1 thru 9999
2 LANG-CODE (A1) /* E,G,F,S,I,D and 1,2,3,4,5,6,7,8,9 allowed
2 RESPONSE (N4) /* Error during execution of USR0020N
1 RETURN-AREA /* Contains the message texts
2 S-FOUND (L) INIT /* TRUE means 'Short text found'
2 L-FOUND (L) INIT /* TRUE means 'Long text found'
2 SHORT-TEXT (A65) INIT <'<<< Short text not found >>>'>
2 LONG-TEXT (A78/1:20) INIT ALL <'<<< Long text not found >>>'>
*
01 DB_ERR_STR (A16)
01 REDEFINE DB_ERR_STR
02 DB_STATUS (A1)
02 DB_TYPE (A1)
02 DB_DBID (B2)
02 DB_FNR (B2)
02 DB_COMMAND (A2)
02 DB_RESP (B2)
02 DB_SUBCODE (B2)
02 DB_ADD1F2B (B2)
*
1 #TERM (I4) INIT <999>
*
END-DEFINE
*
INPUT ERR-NR ERR-LINE ERR-STAT ERR-PGM ERR-LVL
*
SET KEY ALL
SET CONTROL 'MB'
SET CONTROL 'YN'
SET KEY PF3 NAMED 'end'
SET KEY PF12 NAMED 'term'
*
MOVE 'N' TO TYPE /* NATURAL system messages
MOVE 'NAT' TO APPLICATION /* Current application
MOVE ERR-NR TO #ERROR-NUMBER /* Recent error code
* MOVE 2 TO LANG-CODE /* language code German
MOVE 1 TO LANG-CODE /* language code English
*
CALLNAT 'USR0020N' PARM-AREA RETURN-AREA
*
IF RESPONSE > 0
DECIDE ON FIRST VALUE OF RESPONSE
VALUE 1 MOVE 'Wrong message type' TO INFO
VALUE 2 MOVE 'Wrong application' TO INFO
VALUE 3 MOVE 'Wrong error number' TO INFO
VALUE 4 MOVE 'Wrong language code' TO INFO
NONE VALUE
COMPRESS 'Return code of USR0020N:' RESPONSE TO INFO
END-DECIDE
ELSE
IF S-FOUND
MOVE SHORT-TEXT TO INFO
ELSE
IF L-FOUND
MOVE LONG-TEXT (1) TO INFO
END-IF
END-IF
END-IF
*
CALLNAT 'USR2010N' DB_ERR_STR
*
IF *DEVICE NE 'BATCH'
BACKOUT TRANSACTION
*
*
INPUT USING MAP 'NPMERROR' /* map similar to batch
IF *PF-KEY = 'PF12'
TERMINATE
END-IF
IF *PF-KEY = 'PF3'
STOP
END-IF
*
ELSE
WRITE 'Error occurred during program execution'
/ '---------------------------------------'
/
/ 'Program :' ERR-PGM
/ 'Line number :' ERR-LINE
/ 'Error number:' ERR-NR
/
/ INFO
WRITE /// 'Status Type DBID FNR CMD Resp Subc ADD1'
/ 2X DB_STATUS
5X DB_TYPE
4X DB_DBID (EM=HHHH)
3X DB_FNR (EM=HHHH)
2X DB_COMMAND
1X DB_RESP (EM=HHHH)
1X DB_SUBCODE (EM=HHHH)
1X DB_ADD1F2B (EM=HHHH)
*
BACKOUT TRANSACTION
*
TERMINATE #TERM
END-IF
END
Online Error Report
------------------------------------------------------------------------------
17:03:52 *** N A T - P A D *** 2006-06-28
DIETER Error Report NATPAD
NPMERROR
The following error occurred in your application
Program : STR-PAIN
Line : 730
Error number: 1302
------------------------------------------------------------------------------
Division by zero not permitted by parameter ZD=ON.
------------------------------------------------------------------------------
Status Type DBID FNR CMD Resp Subc ADD1
0000 0000 0000 0000 0000
Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---
end term
------------------------------------------------------------------------------
Top Page
|