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