Progress 11.4会话崩溃后返回初始登录界面而非退出到OS如何解决?
解决方案
根因说明
返回登录界面的问题本质是Progress ABL会话默认会把中断、未捕获错误的执行上下文回退到启动时的入口程序(即登录界面程序),而非直接终止进程。之前放置的QUIT语句如果触发时处在嵌套执行上下文、或是被上层错误拦截逻辑覆盖,就不会生效。
可落地的处理方案
- 优先全局拦截中断和错误事件,强制终止进程
直接在登录程序的最开头注册全局中断、错误触发器,触发时直接调用Windows系统API终止整个进程,避免回到登录上下文,示例代码如下:/* 注册全局CTRL-PAUSE(对应ABL的CTRL-BREAK事件)触发器 */ ON CTRL-BREAK ANYWHERE DO: RUN ForceQuit. END. /* 注册全局未捕获错误触发器 */ ON ERROR ANYWHERE DO: RUN ForceQuit. END. PROCEDURE ForceQuit: /* 优先清理所有持久化过程、窗口资源 */ FOR EACH _P WHERE _P._PERSISTENT = YES: DELETE PROCEDURE _P._HANDLE. END. /* 调用Windows系统API直接终止进程,优先级高于Progress自带的QUIT */ PROCEDURE ExitProcess EXTERNAL "kernel32.dll": DEFINE INPUT PARAMETER uExitCode AS LONG NO-UNDO. END PROCEDURE. RUN ExitProcess(0). END. - 检查启动参数与程序上下文配置
- 确认启动Progress客户端的命令行没有添加
-p 登录程序名之外的特殊自动重启参数,也没有配置启动后自动循环执行登录程序的逻辑 - 确认登录程序调用主程序后,没有保留登录程序的持久化实例,也没有在主程序退出后加重启登录界面的分支逻辑
- 确认启动Progress客户端的命令行没有添加
- 替换原有
QUIT语句的调用位置
如果不想调用系统API,可以把所有需要退出的场景下的QUIT替换为QUIT 1,同时在客户端启动命令行添加参数-errorlevel 2,确保会话出错时直接终止进程而非回退到入口程序。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

