2

私は CL プログラムを作成していますが、これは、オブジェクトの欠落など、あらゆる種類の問題がある環境で実行されるため (そうです、意図的なものです)、多くのエラーが発生する可能性があります。これらの可能性のあるメッセージを監視してエラーをバイパスする代わりに、実際にこれらのメッセージをリダイレクトして、プログラム メッセージを使用してユーザーに表示できるようにしたいと考えています。だから私が望むのは、プログラムの実行後、プログラムがすべてのエラーメッセージをポップアップして実行を中断させるのではなく、画面の下部に表示することです。そうすることは可能ですか?どのように?

4

1 に答える 1

4

これは、私の標準的な 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)
于 2012-09-20T15:21:49.373 に答える