| PSDS with PSSR to catch program exceptions in RPG AS400 |
Program Status Data Structure (PSDS)
You can read more about PSDS by reading the following article.
Using Program Error Subroutine (*PSSR)
We can write *PSSR subroutine in our RPG program to handle the program errors/exception
When any error/exception occurs in the RPG program following things happen if we coded PSDS and *PSSR in our RPG program.
You can code a *PSSR subroutine for all the subprocedures in the module and each *PSSR is local to the subprocedure in which it is coded.
Example of PSDS with *PSSR to catch program exceptions in RPGLE
Here in this example, we will divide a number by zero in RPGLE. We will write the code in Fixed format, /Free and Fully Free RPG.
RPG Code in Fixed format for program status data structure in RPG AS400
* Program status data structure
* program exception available to rpg program (1 psds per module)
D psds1 SDS
D proc_name *proc * module/program
* 1 to 10 position, 10 chars
D pgm_status *status * status code
* 11 to 15 position, (5,0) zoned decimal
D pgm_prvstatus 16 20S 0 * Prev. status
D src_listing 21 28 * src. list line
D routine *routine * routine
* 29 to 36 position, 8 chars
* *INIT --> program initialization
* *DETL --> detail lines
* *GETIN --> get input record
* *TOTC --> Total calculations
* *TOTL --> Total lines
* *DETC --> Detail calculations
* *OFL --> Overflow lines
* *TERM --> Program ending
* *ROUTINE --> name of program or procedure called (first 8 chars)
D parms *parms * no. of parms pass
* 37 to 39 position, (3,0) zoned decimal
D excptype 40 42 * exception type
* CPF --> operating system exception
* MCH --> machine exception
D excpnum 43 46 * exception number
* CPF --> CPF message number
* MCH --> MCH message number
D reserved1 47 50 * reserved
D workarea 51 80 * internal use by
* ILE RPG compiler
D pgmlib 81 90 * prgram library
D excpdata 91 170 * exception data
D excpcause 171 174 * exception that
* cause RNX9001
D filename 175 184 * file name on whic
*h last file operati
*on occur updated on
*ly when error occur
D unused 185 190 * unused
D date 191 198 * date(*date format)
D yy 199 200S 0 * first two digits
* of 4 digit year
D filenametrn 201 208 * file name truncate
* (175-184 pos above
D statusinfo 209 243 * status info on las
*t file used
D jobname 244 253 * job name
D username 254 263 * user name
D jobnumber 264 269 * job number
D date2 270 275S 0 * date (udate format
* pgm running
* (191-198 pos above
D pgmrundate 276 281S 0 * date of pgm runnin
D time 282 287S 0 * time (hhmmss)
* pgm running
D date3 288 293 * date (udate format
* pgm compiled
D time2 294 299 * time (hhmmss)
* pgm compiled
D cmplevel 300 303 * compiler level
D srcfile 304 313 * src file name
D srclib 314 323 * src lib name
D srcmbr 324 333 * src file member
D pgmproc 334 343 * pgm containing
* procedure
D modproc 344 353 * module containing
* procedure
D srcid 354 355B 0 * src id match the
* binary 2 (5i,0)
* statement number
* from pos 21-28
D srcid2 356 357B 0 * src id match the
* binary 2 (5i,0)
* statement number
* from pos 228-235
D curuserprf 358 367 * current user profi
D exterrorcd 368 371I 0 * external error cod
* Integer (10,0)
D elements 372 379I 0 * elements set by XM
* Integer (20,0)
*L-INTO or DATA-INTO
D internaljobid 380 395 * internal job id
D systemname 396 403 * system name
D unused2 404 429 * unused
*variable
D num1 S 1P 0 INZ(3)
D num2 S 1P 0 INZ(0)
D result S 1P 0 INZ(0)
D returncode S 6A
D DIVIDEBYZERO S 20A INZ('DIVIDE BY ZERO')
D STATUSCD S 50A INZ('ERROR OCCUR WITH STATUS CODE')
C num1 DIV num2 result
C RESULT DSPLY
C EVAL *INLR = *ON
C *PSSR BEGSR
C IF PGM_STATUS = 00102
C DIVIDEBYZERO DSPLY
C* EVAL RETURNCODE = ' '
C EVAL RETURNCODE = '*CANCL'
C* EVAL RETURNCODE = '*GETIN'
C ELSE
C STATUSCD DSPLY
C PGM_STATUS DSPLY
C EVAL RETURNCODE = '*CANCL'
C ENDIF
C ENDSR returncode
RPG Code in /Free format for program status data structure in RPG AS400
* Program status data structure
* program exception available to rpg program (1 psds per module)
D psds1 SDS
D proc_name *proc * module/program
* 1 to 10 position, 10 chars
D pgm_status *status * status code
* 11 to 15 position, (5,0) zoned decimal
D pgm_prvstatus 16 20S 0 * Prev. status
D src_listing 21 28 * src. list line
D routine *routine * routine
* 29 to 36 position, 8 chars
* *INIT --> program initialization
* *DETL --> detail lines
* *GETIN --> get input record
* *TOTC --> Total calculations
* *TOTL --> Total lines
* *DETC --> Detail calculations
* *OFL --> Overflow lines
* *TERM --> Program ending
* *ROUTINE --> name of program or procedure called (first 8 chars)
D parms *parms * no. of parms pass
* 37 to 39 position, (3,0) zoned decimal
D excptype 40 42 * exception type
* CPF --> operating system exception
* MCH --> machine exception
D excpnum 43 46 * exception number
* CPF --> CPF message number
* MCH --> MCH message number
D reserved1 47 50 * reserved
D workarea 51 80 * internal use by
* ILE RPG compiler
D pgmlib 81 90 * prgram library
D excpdata 91 170 * exception data
D excpcause 171 174 * exception that
* cause RNX9001
D filename 175 184 * file name on whic
*h last file operati
*on occur updated on
*ly when error occur
D unused 185 190 * unused
D date 191 198 * date(*date format)
D yy 199 200S 0 * first two digits
* of 4 digit year
D filenametrn 201 208 * file name truncate
* (175-184 pos above
D statusinfo 209 243 * status info on las
*t file used
D jobname 244 253 * job name
D username 254 263 * user name
D jobnumber 264 269 * job number
D date2 270 275S 0 * date (udate format
* pgm running
* (191-198 pos above
D pgmrundate 276 281S 0 * date of pgm runnin
D time 282 287S 0 * time (hhmmss)
* pgm running
D date3 288 293 * date (udate format
* pgm compiled
D time2 294 299 * time (hhmmss)
* pgm compiled
D cmplevel 300 303 * compiler level
D srcfile 304 313 * src file name
D srclib 314 323 * src lib name
D srcmbr 324 333 * src file member
D pgmproc 334 343 * pgm containing
* procedure
D modproc 344 353 * module containing
* procedure
D srcid 354 355B 0 * src id match the
* binary 2 (5i,0)
* statement number
* from pos 21-28
D srcid2 356 357B 0 * src id match the
* binary 2 (5i,0)
* statement number
* from pos 228-235
D curuserprf 358 367 * current user profi
D exterrorcd 368 371I 0 * external error cod
* Integer (10,0)
D elements 372 379I 0 * elements set by XM
* Integer (20,0)
*L-INTO or DATA-INTO
D internaljobid 380 395 * internal job id
D systemname 396 403 * system name
D unused2 404 429 * unused
*variable
D num1 S 1P 0 INZ(3)
D num2 S 1P 0 INZ(0)
D result S 1P 0 INZ(0)
D returncode S 6A
/Free
// DSPMSGD RANGE(*FIRST *LAST) MSGF(QRNXMSG) DETAIL(*BASIC)
result = num1/num2;
DSPLY result;
*INLR = *ON;
// Normal Codes
// 00000 --> No Exception/Error
// 00001 --> Called program returned with the LR indicator on.
// 00050 --> Conversion resulted in substitution.
// Exception/Error codes
// 00100 --> Value out of range for string operation
// 00102 --> Divide by zero
// 00105 --> Invalid characters in character to numeric conversion functions.
// 00112 --> Invalid Date, Time or Timestamp value.
// 00113 --> Date overflow or underflow.
// 00114 --> Date mapping errors
// 00120 --> Table or array out of sequence.
// 00121 --> Array index not valid
// 00122 --> OCCUR outside of range
// 00211 --> Error calling program or procedure
// 00222 --> Pointer or parameter error
// 00333 --> Error on DSPLY operation
// 00351 --> Error parsing XML document
// 00352 --> Invalid option for %XML
// 00353 --> XML document does not match RPG variable
// 00354 --> Error preparing for XML parsing
// 00401 --> Data area specified on IN/OUT not found
// 00411 --> Data area type or length does not match
// 00412 --> Data area not locked for output
// 00413 --> Error on IN/OUT operation
// 00414 --> User not authorized to use data area
// 00415 --> User not authorized to change data area
// 00421 --> Error on UNLOCK operation
// 00425 --> Length requested for storage allocation is out of range
// 00431 --> Data area previously locked by another program
// 00432 --> Data area locked by program in the same process
// 00450 --> Character field not entirely enclosed by shift-out and shift-in characters
// 00451 --> Conversion between two CCSIDs is not supported
// 00452 --> Some characters could not be converted between two CCSIDs
// 00453 --> An error occurred during conversion between two CCSIDs
// 00803 --> Rollback operation failed.
// 00804 --> Error occurred on COMMIT operation
// 00805 --> Error occurred on ROLBK operation
// 00907 --> Decimal data error (digit or sign not valid)
// 09999 --> Program exception in system routine.
//________________________________________________________________
Begsr *pssr;
If PGM_STATUS = 00102;
DSPLY 'ERROR: DIVIDE BY ZERO';
returncode = ' ';
//returncode = '*CANCL';
//returncode = '*GETIN';
Else;
DSPLY 'ERROR OCCURRED WITH STATUS CODE';
DSPLY PGM_STATUS;
returncode = '*CANCL';
EndIf;
endsr returncode;
//________________________________________________________________
/End-Free
RPG Code in Fully Free format for program status data structure in RPG AS400
**FREE
//Program status data structure
//program exception available to rpg program (1 psds per module)
dcl-ds psds1 psds;
proc_name *proc; // module/program
// 1 to 10 position, 10 chars
pgm_status *status; // status code
// 11 to 15 position, (5,0) zoned decimal
pgm_prvstatus zoned(5);// Prev. status
src_listing char(8); // src. list line
routine *routine; // routine
// 29 to 36 position, 8 chars
// *INIT --> program initialization
// *DETL --> detail lines
// *GETIN --> get input record
// *TOTC --> Total calculations
// *TOTL --> Total lines
// *DETC --> Detail calculations
// *OFL --> Overflow lines
// *TERM --> Program ending
// *ROUTINE --> name of program or procedure called (first 8 chars)
parms *parms; // no. of parms pass
// 37 to 39 position, (3,0) zoned decimal
excptype char(3); // exception type
// CPF --> operating system exception
// MCH --> machine exception
excpnum char(4);//exception number
// CPF --> CPF message number
// MCH --> MCH message number
reserved1 char(4);// reserved
workarea char(30); // internal use by ILE RPG compiler
pgmlib char(10); // prgram library
excpdata char(80); // exception data
excpcause char(4); //exception that cause RNX9001
filcname char(10); // file name on whicc last file operation occur updated only when error occur
unused char(6); //unused
date char(8); //date(*date format)
yy zoned(2); //first two digits of 4 digit year
filenametrn char(8); // file name truncate 175-184 pos above
statusinfo char(35); // status info on last file used
jobname char(10); // job name
username char(10); // user name
jobnumber zoned(6); //job number
date2 zoned(6); // date (udate format pgm running (191-198 pos above
pgmrundate zoned(6); // date of pgm running
time zoned(6); // time (hhmmss) pgm running
date3 char(6); // date (udate format pgm compiled
time2 char(6); // time (hhmmss) pgm compiled
cmplevel char(4); // compiler level
srcfile char(10); // src file name
srclib char(10); // src lib name
srcmbr char(10); //src file member
pgmproc char(10); // pgm containing procedure
modproc char(10); // module containing procedure
srcid bindec(2); // src id match the statement number from pos 21-28
srcid2 bindec(2); // src id match the statement number from pos 228-235
// binary 2 (5i,0)
curuserprf char(10); // current user profi
exterrorcd int(10); // external error cod
// Integer (10,0)
elements int(20); //elements set by XML-INTO or DATA-INTO
// Integer (20,0)
internaljobid char(16); //internal job id
systemname char(8); // system name
unused2 char(6); //unused
end-ds;
dcl-s num1 packed(1:0) inz(3);
dcl-s num2 packed(1:0) inz(0);
dcl-s result packed(1:0) inz(0);
dcl-s returncode char(6);
result = num1/num2;
DSPLY result;
*INLR = *ON;
Begsr *pssr;
If PGM_STATUS = 00102;
DSPLY 'ERROR: DIVIDE BY ZERO';
returncode = ' ';
//returncode = '*CANCL';
//returncode = '*GETIN';
Else;
DSPLY 'ERROR OCCURRED WITH STATUS CODE';
DSPLY PGM_STATUS;
returncode = '*CANCL';
EndIf;
endsr returncode;
Related Post
Read also :
- Data Structure and Types of DS in RPG AS400
- Using a Data Structure to subdivide the field in RPG AS400
- Using a Data Structure to group fields in RPG AS400
- Externally Described Data Structure in RPG AS400
- Using EXTFLD to code Externally Described DS in RPG AS400
- Using PREFIX to rename all fields in an external data structure in RPG AS400
- Define an externally-described data structure using the LIKEREC keyword in RPG AS400
- Difference between LIKEREC and EXTNAME keyword in RPG AS400
- Multiple Occurrence Data Structure in RPG AS400
- Data Area Data Structure in RPG AS400
- *LDA Local data area data structure in RPG AS400
- File information data structures (INFDS) in RPG AS400
- Indicator data structure in RPG AS400
- Program Status Data Structure in RPG AS400
- Using keywords QUALIFIED, LIKEDS, and DIM with data structures
- Array Data Structures in RPG AS400
- Defining Data Structure Parameters in a Prototype or Procedure Interface
- Using INFDS with INFSR to catch file exception in RPG AS400