RPG

165. RPG のエラー・モニター (3)

最後に紹介する RPG のエラー・モニターは MONITOR 命令によるエラー・モニターである。
RPG ではなく他言語の場合は、あるルーチンの一部のエラーをモニターするという方法が一般的であるが
RPG には、そのような方法はなかった。

VisualBASICOn Error Goto
VC++try catch
Javatry catch
C#pragma exception_handler
CLPMONMSG

などが、それであるが、これから行うしばらくの演算中に、もしエラーが起こったら 〜 しなさい
という命令である。
MONITOR 命令 から ENDMON のあいだに ON-ERROR 〜 という命令を定義することができる。

【 RPG : TESTMON 】
--------------------------------------------------------------------------------------------
0001.00 H DATEDIT(*YMD/) DFTNAME(TESTPSSR)                                                  
0002.00 F********** MONITOR によるエラー・モニター ****************************             
0003.00 F**********************************************************************             
0004.00 D KINGAKU         S              7S 0 INZ(8000)                                     
0005.00 D SURYO           S              4S 0 INZ(0)                                        
0006.00 D TANKA           S              7S 0                                               
0007.00                                                                                     
0008.00 D CPFMSGLIB       S             20A   INZ('QCPFMSG   *LIBL     ')                   
0009.00 D PGMSTKCNT       S             10I 0 INZ(1)                                小数    
0010.00 D EXCP_LEN        S             10I 0 INZ(80)                               小数    
0011.00 D APIERR          DS                                                                
0012.00 D  GETBYT                 1      4B 0 INZ(160)                                      
0013.00 D  AVLBYT                 5      8B 0 INZ(0)                                        
0014.00 D  MSG_ID                 9     15                                                  
0015.00 D  MSG_DTA               17    160                                                  
0016.00                                                                                     
0017.00 D*( プログラム状況データ構造 )                                                      
0018.00 D INFDSP         SDS                                                                
0019.00 D                              512A                                                 
0020.00 D  CPFID                         7A   OVERLAY(INFDSP:40)                            
0021.00 D  PGMID                        10A   OVERLAY(INFDSP:334)                           
0022.00 D  EXCP_ID                       4A   OVERLAY(INFDSP:171)                           
0023.00 D  EXCP_DATA                    80A   OVERLAY(INFDSP:91)                            
0024.00                                                                                        
0025.00 C*  単価 =  金額 / 数量   を計算 (  数量は 0 である )                                  
0026.00 C                   MONITOR                                                            
0027.00 C                   EVAL      TANKA = KINGAKU / SURYO                                  
0028.00 C                   ON-ERROR  *PROGRAM                                                 
0029.00 C                   EXSR      *PSSR                                                    
0030.00 C                   ENDMON                                                             
0031.00 C                   SETON                                        LR                    
0032.00 C                   RETURN                                                             
0033.00 C******************************************************                                
0034.00 C     *PSSR         BEGSR                                                              
0035.00 C******************************************************                                
0036.00 C     CPFID         IFNE      *BLANKS                                      CPFID<>*BLK
0037.00 C*----------------------------------------------------+                                
0038.00 C                   CALL      'QMHSNDPM'                                               
0039.00 C                   PARM                    CPFID                          |           
0040.00 C                   PARM                    CPFMSGLIB                      |           
0041.00 C                   PARM                    EXCP_DATA                      |           
0042.00 C                   PARM                    EXCP_LEN                       |           
0043.00 C                   PARM      '*COMP     '  MSGTYPE          10            |           
0044.00 C                   PARM      '*PGMBDY   '  PGMQUE           10            |           
0045.00 C                   PARM                    PGMSTKCNT                      |           
0046.00 C                   PARM                    MSGKEY            4            |           
0047.00 C                   PARM                    APIERR                                     
0048.00 C*----------------------------------------------------+     
0049.00 C                   END                                     
0050.00 C                   ENDSR     '*CANCL'                      
----------------------------------------------------------------------------------------------
【 解説 】

ファイル仕様書に *PSSR を定義するのとは違って、プログラマーが制御した部分で *PSSR を呼び出すことが
できるので、エラーの処理はしやすくなる。

0028.00 C                   ON-ERROR  *PROGRAM
0029.00 C                   EXSR      *PSSR
0030.00 C                   ENDMON

*PROGRAM とはプログラム演算にかかわる、どのようなエラーでも発生したらサブルーチン : *PSSR
実行せよ、という意味である。
*PROGRAM だけでなく *FILE や特定のメッセージ・コードだけをモニターすることもできる。
MONITOR 命令 によってエラー監視が柔軟にできるようになったのは確かである。