如何捕获ABAP中MESSAGE RAISING类型的异常?
解决ABAP中
MESSAGE ... RAISING异常的捕获问题 首先要明确:MESSAGE ID 'XYZ' TYPE 'E' NUMBER 123 RAISING exception_name生效的前提是**exception_name必须在抛出异常的程序/函数/方法中预先声明**,否则RAISING子句会失效,TYPE 'E'的消息会直接触发系统硬错误,导致程序退出而无法被捕获。
以下分两种场景给出具体解决方法:
场景1:使用经典异常(Classic Exceptions)
如果exception_name是经典异常(非面向对象异常类),需按以下步骤操作:
1. 在被调用的函数模块中声明异常
FUNCTION zfm_test_exception. " 必须在EXCEPTIONS里声明要抛出的经典异常 EXCEPTIONS invalid_input. " 对应你代码中的exception_name * 函数逻辑 MESSAGE ID 'XYZ' TYPE 'E' NUMBER 123 RAISING invalid_input. ENDFUNCTION.
2. 调用端的两种捕获方式
方式A:通过EXCEPTIONS子句判断sy-subrc
这是兼容所有ABAP版本的传统写法:
CALL FUNCTION 'ZFM_TEST_EXCEPTION' EXCEPTIONS invalid_input = 1 OTHERS = 2. IF sy-subrc = 1. WRITE: / '捕获到invalid_input异常'. " 这里可以添加自定义处理逻辑 ELSEIF sy-subrc = 2. WRITE: / '捕获到其他异常'. ENDIF.
方式B:ABAP 7.50+版本使用TRY...CATCH SYSTEM-EXCEPTION
如果你的系统版本支持,可以用更简洁的面向对象语法捕获经典异常:
TRY. CALL FUNCTION 'ZFM_TEST_EXCEPTION' RAISING invalid_input. CATCH SYSTEM-EXCEPTION invalid_input = 1. WRITE: / '捕获到invalid_input经典异常'. ENDTRY.
场景2:使用面向对象异常(OO Exceptions)
如果exception_name是自定义的异常类,需按以下步骤操作:
1. 定义并声明异常类
" 定义异常类 CLASS zcx_custom_exception DEFINITION PUBLIC INHERITING FROM cx_static_check. PUBLIC SECTION. METHODS constructor IMPORTING textid TYPE symsg DEFAULT 'XYZ' RAISING cx_static_check. ENDCLASS. CLASS zcx_custom_exception IMPLEMENTATION. METHOD constructor. super->constructor( textid = textid ). ENDMETHOD. ENDCLASS.
2. 在被调用的方法中声明抛出该异常
CLASS zcl_test_class DEFINITION PUBLIC. PUBLIC SECTION. METHODS process_data RAISING EXCEPTION TYPE zcx_custom_exception. ENDCLASS. CLASS zcl_test_class IMPLEMENTATION. METHOD process_data. MESSAGE ID 'XYZ' TYPE 'E' NUMBER 123 RAISING zcx_custom_exception. ENDMETHOD. ENDCLASS.
3. 调用端捕获异常
DATA(lo_test_obj) = NEW zcl_test_class( ). TRY. lo_test_obj->process_data( ). CATCH zcx_custom_exception INTO DATA(lo_exception). WRITE: / '捕获到OO异常:', lo_exception->get_text( ). " 可通过异常类方法获取详细错误信息 ENDTRY.
你之前捕获失败的常见原因
- 异常未被声明:抛出异常的代码所在的函数/方法没有在
EXCEPTIONS(经典异常)或RAISING(OO异常)中声明exception_name,导致RAISING子句无效,TYPE 'E'消息直接终止程序。 - 捕获方式不匹配:用普通
TRY...CATCH捕获经典异常,或者用EXCEPTIONS子句捕获OO异常,都会导致捕获失败。
内容的提问来源于stack exchange,提问作者Jonathan Benn
相关产品推荐
相关产品推荐

