Progress ABL中Java System.out.println()的等效实现及输出判断问询
在Progress ABL中模拟Java的System.out.println()
你用MESSAGE语句模拟System.out.println()的思路是合理的,MESSAGE确实是ABL里最接近控制台输出的原生语句。针对你提出的“如何判断默认输出是否存在”的问题,结合MESSAGE的运行逻辑,可通过以下方式实现可靠判断:
一、输出可用性的可靠判断逻辑
MESSAGE依赖会话的终端/输出设备,结合以下几个SESSION属性和函数,能准确判断默认输出是否可用:
SESSION:BATCH-MODE:值为TRUE时,说明当前是批处理模式运行,无交互式终端,MESSAGE无法输出到用户可见的终端(仅可能被重定向到日志)SESSION:DISPLAY-TYPE:当属性值为DISPLAY-TYPE:NONE时,代表没有可用的显示终端,MESSAGE会执行失败TERMINAL()函数:返回FALSE时,说明当前无物理终端连接
基于以上条件,你可以在println方法开头添加前置判断,避免不必要的MESSAGE调用和异常捕获:
METHOD STATIC PUBLIC VOID println(i_cText AS CHAR): /* 先判断是否有可用的输出终端 */ IF SESSION:BATCH-MODE = FALSE AND SESSION:DISPLAY-TYPE <> DISPLAY-TYPE:NONE AND TERMINAL() THEN DO: MESSAGE i_cText SKIP. PAUSE 0. END. /* 批处理或无终端时,可选择输出到日志文件替代 */ ELSE DO: OUTPUT TO VALUE("application.log") APPEND NO-ERROR. IF NOT ERROR-STATUS:ERROR THEN DO: PUT UNFORMATTED i_cText. OUTPUT CLOSE. END. END. END.
二、MESSAGE的典型失败场景
MESSAGE主要会在以下场景执行失败:
- 会话以批处理模式启动(
SESSION:BATCH-MODE = TRUE)且未指定输出重定向 - 运行环境无可用显示终端(比如无GUI的服务器后台运行,
SESSION:DISPLAY-TYPE = DISPLAY-TYPE:NONE) - 终端连接丢失(比如远程会话断开后继续执行代码)
三、优化异常处理方案
虽然MESSAGE不支持NO-ERROR,但通过前置判断可大幅减少异常触发概率,同时保留异常捕获作为兜底:
METHOD STATIC PUBLIC VOID println(i_cText AS CHAR): DEFINE LOGICAL l_hasOutput. l_hasOutput = (SESSION:BATCH-MODE = FALSE AND SESSION:DISPLAY-TYPE <> DISPLAY-TYPE:NONE AND TERMINAL()). IF l_hasOutput THEN DO: DO ON ERROR UNDO, LEAVE: MESSAGE i_cText SKIP. PAUSE 0. END. END. ELSE DO: /* 批处理模式下输出到日志 */ OUTPUT TO VALUE("batch-output.log") APPEND NO-ERROR. IF NOT ERROR-STATUS:ERROR THEN DO: PUT UNFORMATTED i_cText. OUTPUT CLOSE. END. END. END.
内容的提问来源于stack exchange,提问作者W0lfw00ds
相关产品推荐
相关产品推荐

