ABAP能否在LOAD-OF-PROGRAM事件中终止程序执行?
LOAD-OF-PROGRAM事件退出规则说明
你的理解是对的:LOAD-OF-PROGRAM是ABAP内核加载程序时触发的首个内部事件,属于程序初始化的内核管控流程,事件块必须完整执行到末尾。所有会打断当前事件执行流、跳转到其他上下文的常规退出语句——包括RETURN、STOP、E/A/X类型消息、各类LEAVE语句——都会触发Illegal interruption of the event LOAD-OF-PROGRAM运行时错误。
该事件块内唯一能终止程序的语句是直接触发dump的RAISE SHORTDUMP,但这种方式会直接抛出系统运行时错误页,交互体验极差,完全不适用于权限校验场景。
LOAD-OF-PROGRAM实现一次性权限校验的落地方案
不需要强行在LOAD-OF-PROGRAM事件块内写退出逻辑,利用ABAP全局变量的内存生命周期特性,就能实现校验逻辑仅执行一次,同时规避dump问题:
- 首先定义程序全局的校验状态标记变量
- 在
LOAD-OF-PROGRAM中完成全部自定义权限校验逻辑,只给全局标记赋值,不执行任何退出操作——这部分逻辑整个程序运行周期只会跑一次 - 在
INITIALIZATION等后续可安全退出的事件块开头,直接读取全局标记判断权限结果,无权限则直接终止程序,不需要重复执行校验逻辑
参考实现代码:
" 全局变量定义区 DATA: gv_auth_check_passed TYPE abap_bool VALUE abap_false. LOAD-OF-PROGRAM. " 此处编写全部自定义权限校验逻辑,整个程序生命周期仅执行一次 gv_auth_check_passed = do_validate( ). INITIALIZATION. " 多选择屏幕多次触发INITIALIZATION时,直接读取全局标记即可,不会重复执行校验 IF gv_auth_check_passed = abap_false. MESSAGE 'You are busted!' TYPE 'E'. " 若不需要停留在当前选择屏幕,可直接使用LEAVE PROGRAM退出整个程序 ENDIF.
这种方案既利用了LOAD-OF-PROGRAM单次执行的特性,解决了多选择屏幕下INITIALIZATION重复触发校验的问题,也不会触发事件中断类的运行时错误。
相关实践参考
- 不要尝试在
LOAD-OF-PROGRAM中强行终止程序:该事件执行时,程序的GUI上下文、选择屏幕对象、列表缓冲区等运行时资源都还没完成初始化,此时强行退出要么触发dump,要么会出现GUI状态错乱、屏幕残留等异常 - 针对SE93分配权限对象灵活性不足的场景,上述「全局标记+LOAD-OF-PROGRAM执行校验计算+首个安全退出点做终止判断」是ABAP开发领域的通用实现方案,比通过屏幕编号区分INITIALIZATION执行逻辑的写法更简洁,也没有重复校验的性能损耗
- 如果追求更好的交互体验,也可以把权限判断的终止逻辑放在
AT SELECTION-SCREEN OUTPUT事件的最开头,该事件在每个选择屏幕的PBO阶段触发,配合全局标记同样可以实现一次校验、全局生效,且该阶段抛出消息的交互表现比INITIALIZATION阶段更稳定。
内容的提问来源于stack exchange,提问作者Suncatcher
相关产品推荐
相关产品推荐

