You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何捕获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.

你之前捕获失败的常见原因

  1. 异常未被声明:抛出异常的代码所在的函数/方法没有在EXCEPTIONS(经典异常)或RAISING(OO异常)中声明exception_name,导致RAISING子句无效,TYPE 'E'消息直接终止程序。
  2. 捕获方式不匹配:用普通TRY...CATCH捕获经典异常,或者用EXCEPTIONS子句捕获OO异常,都会导致捕获失败。

内容的提问来源于stack exchange,提问作者Jonathan Benn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:52:11