× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.


  • Subject: *PSSR - Error handling in RPG
  • From: "Simon Coulter" <shc@xxxxxxxxxxxxxxxxx>
  • Date: Tue, 05 Jan 99 07:57:31 +0100

Hello Derick,

Excellent!  Nice to see an AS/400 programmer caring about error handling for a 
change.

There are three major error handling techniques in RPG; do nothing and let the 
default error handler take 
control (that's the one which displays something like "Error occurred at line 
1234 (C G D S)"), use resulting 
indicators and TEST their status, or code automatic subroutines to handle 
errors.

There are two possible subroutines; A file error subroutine (INFSR) and a 
program error subroutine (*PSSR).  
File error routines can be given any name but need to be associated with the 
file.  That is done on the 
F-spec by using the INFSR keyword.  The program error subroutine MUST be called 
*PSSR and simply having it 
declared in the program is enough for the RPG compiler to pass control to it 
when an unmonitored (no 
resulting indicator) exception occurs.  Note that the *PSSR WILL NOT 
automatically get control for I/O 
exceptions however the *PSSR can be used for both purposes if you name the 
*PSSR as the INFSR routine.  Both 
the file and program error routines can be invoked by EXSR e.g., EXSR *PSSR.

Now for the bad news:  When the file and program error routines are invoked by 
the RPG exception handler due 
to an unmonitored exception it is done as an unconditional branch, a GOTO if 
you will, rather than an EXSR.  
This makes it very difficult to determine the return point.  The return points 
provided by RPG (*GETIN, 
*DETC, etc) are parts of the cycle and are effectively targets for a GOTO from 
the ENDSR statement in the 
*PSSR.  *GETIN is the start of the Get Input section of the logic cycle.  It is 
not possible to provide your 
own branch points on the ENDSR statement.

Usually what one does is to use the error routines to gracefully exit the 
program rather than try to recover.  
However it may be possible to use the STATUS code fields in the INFDS or SDS 
data structures to determine if 
the error is recoverable and design logic into your program such that the *PSSR 
can determine where it was 
called from; a status flag of some sort which is tested and then an 
unconditional branch is performed to the 
appropriate section of the program.  This is usually SO UGLY that I cannot 
commit such an atrocity and mostly 
send a nice screen to the user telling them why the program broke, send a 
message to QSYSOPR, dump the 
program, job, and joblog, and cleanly close down.

Russ Popiel wrote a book called "RPG Exception Handling" available from Duke 
Press (News/400 Magazine) which 
is fairly good.

Here is an extract from my template showing how this stuff is defined.  Note 
that the SDS is externally 
described and has the fields #STSCD and #LFUST, etc.  The DUMP subroutine is 
the one which decides whether to 
dump the program, joblog, job, etc.  You would test the value of the DBFSTS or 
DSPSTS fields in the *PSSR to 
determine if the error was recoverable.  A SELEC block with tests and GOTOs 
would work (ugly but no other 
choice)

     ‚*------------------------------------------------------------------------
     ‚* F I L E   D E C L A R A T I O N S
     ‚*------------------------------------------------------------------------
     F                                 DISK         KINFDS DBFDS      UC
     F                                              KINFSR *PSSR
     F                                 WORKSTN      KINFDS DSPDS
     F                                              KINFSR *PSSR
     ‚*------------------------------------------------------------------------
     ‚* D A T A   S T R U C T U R E   D E C L A R A T I O N S
     ‚*------------------------------------------------------------------------
     ‚* File information feed back mapping - outfile
     IDBFDS       DS
     I                                      *STATUS DBFSTS
     I                                    B 156 1590RCDCNT
     I                                    B 397 4000RELREC
     ‚* File information feed back mapping - screen
     IDSPDS       DS
     I                                    H *STATUS DSPSTS
     I                                      369 369 CFKEY
     I                                    B 370 3710CSR
     I                                    B 376 3770SFLRRN
     I                                    B 378 3790TOPRRN
     ‚* Program status data structure mapping
     IPSDS      ESDSPSDSP
     ‚/TITLE    program name : description - *PSSR
---> CSR         *PSSR     BEGSR                           ‚
     ‚* If we've been here before clear off
B1   C           *INLR     IFEQ $ON                        ‚
<=== C                     RETRN                           ‚
E1   C                     END                             ‚*INLR = $ON
     ‚*
     C                     SETON                     LR    ‚
     C                     Z-ADD#STSCD    STSCDE  50       ‚
     C                     MOVEL#MSGID    ERRMSG  7        ‚
     ‚* Go home
B1   C           STSCDE    IFGT 00000                      ‚
*1   C           #LFUST    ORGT '00000'                    ‚
<--- C                     EXSR DUMP                       ‚
E1   C                     END                             ‚STSCDE > 00001
<=== C                     RETRN                           ‚
     ‚*
<--- CSR                   ENDSR                           ‚*PSSR


Regards,
Simon Coulter.

//----------------------------------------------------------
// FlyByNight Software         AS/400 Technical Specialists
// Phone: +61 3 9419 0175      Mobile: +61 0411 091 400
// Fax:   +61 3 9419 0175      E-mail: shc@flybynight.com.au
// 
// Windoze should not be open at Warp speed.
//--- forwarded letter -------------------------------------------------------
> X-Mailer: Internet Mail Service (5.5.1960.3)
> Date: Mon, 04 Jan 99 04:03:27 -0500
> From: "Derick A Lewis" <DERICKAL@india.mastech.com>
> To: MIDRANGE-L@midrange.com
> Reply-To: MIDRANGE-L@midrange.com

> 
> Hi
> 
> I am a beginner on AS400 and I need some tips on how to use error
> handling.  I am trying to use *PSSR.
> For eg if I want to type a command on my screen and want to trap an
> error how do I go about doing it?  I would like to use *PSSR and I know
> how to use RPG3.  I would appreciate if the solution would be in RPG3.
> I want to get into the line after the error line in the program, after
> rectifing the error.  I have tried using *GETIN but I am not sure if it
> is the right thing to do.      
> 
> Derick A. Lewis
> 
> +---
> | This is the Midrange System Mailing List!
> | To submit a new message, send your mail to MIDRANGE-L@midrange.com.
> | To subscribe to this list send email to MIDRANGE-L-SUB@midrange.com.
> | To unsubscribe from this list send email to MIDRANGE-L-UNSUB@midrange.com.
> | Questions should be directed to the list owner/operator: david@midrange.com
> +---
> 

+---
| This is the Midrange System Mailing List!
| To submit a new message, send your mail to MIDRANGE-L@midrange.com.
| To subscribe to this list send email to MIDRANGE-L-SUB@midrange.com.
| To unsubscribe from this list send email to MIDRANGE-L-UNSUB@midrange.com.
| Questions should be directed to the list owner/operator: david@midrange.com
+---


As an Amazon Associate we earn from qualifying purchases.

This thread ...


Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.