如何在SELECT...ENDSELECT语句内监控CPF5813消息?
在IBM i CL中,SELECT语句内如何正确实现消息监控?
我有一段CL代码,单独执行时即使QTEMP/FILE1已存在也能正常运行:
CRTPF FILE(QTEMP/FILE1) RCDLEN(133) MONMSG MSGID(CPF5813)
但把这段代码放到SELECT...ENDSELECT语句块里后,MONMSG就无法处理文件已存在的CPF5813报错,执行时仍会触发该错误:
SELECT WHEN (&A *EQ &B) THEN(DO) CRTPF FILE(QTEMP/FILE1) RCDLEN(133) MONMSG MSGID(CPF5813) ... other codes ENDDO OTHERWISE (DO) ... other codes ENDDO ENDSELECT
问题原因
CL语言里,MONMSG的作用范围是当前的DO/ENDDO块或程序主逻辑。在SELECT结构的DO块中,直接把MONMSG放在CRTPF之后,它无法正确绑定到前面的CRTPF命令——因为SELECT本身是控制结构,内部的DO块需要明确的错误处理上下文。
解决方法
方法1:调整MONMSG的位置或嵌套DO块
- 把
MONMSG放在DO块的开头,监控整个块内的CPF5813消息:
SELECT WHEN (&A *EQ &B) THEN(DO) MONMSG MSGID(CPF5813) CRTPF FILE(QTEMP/FILE1) RCDLEN(133) ... other codes ENDDO OTHERWISE (DO) ... other codes ENDDO ENDSELECT
- 或者给CRTPF单独嵌套一个DO/ENDDO块,让MONMSG只监控这条命令:
SELECT WHEN (&A *EQ &B) THEN(DO) DO CRTPF FILE(QTEMP/FILE1) RCDLEN(133) MONMSG MSGID(CPF5813) ENDDO ... other codes ENDDO OTHERWISE (DO) ... other codes ENDDO ENDSELECT
方法2:先检查文件是否存在再创建
如果不想依赖MONMSG,可以用CHKOBJ先判断文件是否存在,仅当文件不存在时执行CRTPF:
SELECT WHEN (&A *EQ &B) THEN(DO) CHKOBJ OBJ(QTEMP/FILE1) OBJTYPE(*FILE) MONMSG MSGID(CPF9801) EXEC(CRTPF FILE(QTEMP/FILE1) RCDLEN(133)) ... other codes ENDDO OTHERWISE (DO) ... other codes ENDDO ENDSELECT
这里CHKOBJ如果找不到文件会抛出CPF9801,此时触发EXEC里的CRTPF;若文件已存在,CHKOBJ正常执行,跳过CRTPF。
内容的提问来源于stack exchange,提问作者Asymptote
相关产品推荐
相关产品推荐

