วันอังคารที่ 27 พฤษภาคม พ.ศ. 2557

ดัก ErrorMsg ป้องกัน Dump กัน

ดักจับ ErrorMsg กัน

บางครั้ง โปรแกรมเมอร์  มักพบปัญหาที่คาดไม่ถึง "ชนิดยาก"
เช่น Error เกิดขึ้นตอนกลางคืน (ขณะทดสอบอย่างหนัก ไม่ยักพบปัญหา) เป็นต้น

การดักจับ Error (handler) เทียบกับภาษาอื่น
- ใน CL  คือ  MonMsg
- ใน .net  คือ Try .. Catch ...

การดักจับ Error ใน RPG มีได้ 4 วิธี


  • ใช้ Error indicator หรือ an 'E' operation code extender 
  • ใช้ MONITOR group
  • ใช้ Error subroutine 
  • ใช้ Default exception



แต่ละวิธี  มีจุดเด่น/จุดด้อย ต่างกัน  คนที่สนใจไปอ่านเพิ่มได้ครับ
วันนี้เราจะมาพูดถึงตัวที่   ทำง่าย ที่สุด นั่นคือ  Error Subroutine ครับ

เพียงแค่ประกาศ  เพิ่มส่วนนี้
CL0N01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHiLoEq
C*=================================
C           *PSSR     BEGSR                        
C*-------------------------
C**
C                     SETON                     LR 
C   LR                RETRN                        
C                     ENDSR                        
C*=================================

ประยุกต์ อื่นๆ
- ให้ทำงานต่อ หรือ หยุด  หรือ ทำ Rollback (อันนี้ผมไม่ได้ใช้)
- ให้ ส่งค่าตัวแปร  กลุ่มที่อยากรู้ออกมา เช่น ใช้คำสั่ง  DSPLY
- ให้ ส่งสถานะ  ตำแหน่งที่มีปัญหา,ชื่อ Error   (ตัวแปรจากระบบ)
IDsname....NODsExt-file++.............OccrLen+..........
I           SDS                                     
I                                     *ROUTINE ELOC 
I                                     *STATUS  ESTS
I                                        1  10 PPGMID
I                                       11  150PSTS  
I                                       21  28 PLINE  

Note ถ้าใช้ RPGILE จะมี ตัวช่วย ให้เลือกมากกว่านี้

การทดลอง
รู้แล้ว ควรจะทดลองซะหน่อย ครับ

1.  เขียนโปรแกรมสั้นๆ      1 หารด้วย 0   

C           100       DIV  0         J#      30   
C                     SETON                     LR
C   LR                RETRN                       

     สั่ง run  ... จะเกิด Error ดังนี้
xxxx 900 tried to divide by zero (factor 2) (C G S D F).

    ให้ตอบ Msg เป็น "D" = dump  เราจะได้ Spool  และเห็น  ค่าตัวแปรต่างๆ ณ. จุดที่เกิด Error

RPG/400 FORMATTED DUMP                                         
Program Status Area:                                           
Program Name . . . . . . . . . . . . . :   QTEMP/xxxx        
Program Status . . . . . . . . . . . . :   00102               
                tried to divide by zero (factor 2) (C G S D F).
Previous Status  . . . . . . . . . . . :   00000               
Statement in Error . . . . . . . . . . :   900                 
RPG Routine  . . . . . . . . . . . . . :   *DETC               
Number of Parameters . . . . . . . . . :   001  

...

*...+....1....+....2....+....3....+....4....+....5....+....6....+
 ZIGNDECD 0603C4  CHAR(1)       '0'                             
 ZPGMSTUS 05FDF6  CHAR(400)     'XXXXXX    0010200000900     
          05FE55    +96         '                            
          05FEB4    +191        '        20                  
          05FF13    +286        '380528141106300001QRPGSRC   

    Note ตำแหน่ง ค่าต่างๆในตัวแปร ดูได้ที่ ZPGMSTUS
    Note ค่าใน Spool หลายตัว ส่งผ่านเป็น  ตัวแปร  นำมาใช้งานได้  ESTS กับ PSTS เป็นค่าเดียวกัน