2012-09-20 53 views
1

我正在寫一個CL程序,它會遇到很多錯誤,因爲它會在像缺少對象(是的,這是故意的)等各種問題的環境中執行。我實際上不想監視這些可能的消息並繞過錯誤,而是重定向這些消息,以便它們可以使用程序消息並顯示給用戶。所以我想要的是程序執行後,程序會將所有錯誤信息顯示在屏幕的底部,而不是讓它們彈出並中斷執行。是否有可能這樣做?怎麼樣?如何捕獲AS400系統錯誤信息並將其用作CL中的我自己的程序信息?

回答

2

這是我的標準CL錯誤處理過程。一般來說,我會使用MONMSG內聯來處理我預期可能會出現的錯誤。通常,對於我所期望的錯誤,我通常不會告訴最終用戶他們。如果您需要這樣做,請將RCVMSG/SNDPGMMSG對配置爲子例程,然後調用該線程將錯誤滲透到調用方。這個想法是接收診斷消息並重新發送給調用者,然後對異常消息執行相同的操作。

PGM 

    DCL &MSGID *CHAR 7  
    DCL &MSGDTA *CHAR 256 

    /* Trap all errors, and let the error routine handle */ 
    MONMSG (CPF0000 MCH0000) EXEC(GOTO ERROR)  

    /* processing happens here */ 
    /* if an unexpected error occurs, we drop to the error routine */ 

/* We expect this error, but tell the caller about it anyway */ 
dltf mylib/myfile 
monmsg cpf2105 exec(do) 
callsubr percolate 
endoo 

    /* end of processing */ 
    RETURN              

      /* This is the error handling routine. Basically it */  
      /* simply re-sends the messages back up to the  */  
      /* caller, so it dies "gracefully" instead of  */  
      /* giving a hard halt.        */  
          /* Re-send diagnostic messages */    
    ERROR:  RCVMSG  MSGTYPE(*DIAG) MSGDTA(&MSGDTA) MSGID(&MSGID) 
       IF   (&MSGID *EQ '  ') GOTO ERROR_ESC   
       SNDPGMMSG MSGID(&MSGID) MSGF(QCPFMSG) MSGDTA(&MSGDTA) + 
          MSGTYPE(*DIAG)        
       MONMSG  (CPF0000 MCH0000)        
       GOTO  ERROR           

          /* Re-send escape message and RETURN */   
    ERROR_ESC: RCVMSG  MSGTYPE(*EXCP) MSGDTA(&MSGDTA) MSGID(&MSGID) 
       SNDPGMMSG MSGID(&MSGID) MSGF(QCPFMSG) MSGDTA(&MSGDTA) + 
          MSGTYPE(*ESCAPE)        
       MONMSG  (CPF0000 MCH0000)        
       RETURN              

       ENDPGM              

編輯:添加子文件消息隊列來回答。

也許一個子文件消息隊列? DDS:

A   R BMENUS     SFL 
A* 
A          TEXT('Message subfile') 
A          SFLMSGRCD(20) 
A   WMSGK      SFLMSGKEY 
A   WPGMQ      SFLPGMQ 
A   R BMENUC     SFLCTL(BMENUS) 
A* 
A          TEXT('Message subfile control recor- 
A          d') 
A          OVERLAY 
A          LOCK 
A          SFLDSP 
A          SFLINZ 
A          SFLSIZ(0006) 
A          SFLPAG(0003) 
A   WPGMQ      SFLPGMQ 

CLP:

  DCLF  FILE(BMENUFM) 
     ... 
     CHGVAR  &WPGMQ 'BMENU' 
     ... 
     SNDF  RCDFMT(BMENUC) 
     SNDRCVF RCDFMT(BMENUR) 
+0

這樣的程序本身不會完成它被設計爲,對不對?假設在ENDDO之後有第二個DLTF,這個語句不會被執行,是嗎? –

+0

這是我目前如何做的一個例子。你不必精確地複製它 - 隨意從ERROR:處理到下一個子程序......在我的示例代碼中,我稱它爲PERCOLATE。查找[CALLSUBR](http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Frbam6%2Fcallsubrc.htm)它可以在V5R4上運行。 –

+0

爲什麼在SNDPGMMSG後監視CPF0000和MCH0000?預計它會以某種方式失敗? –