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

如何将FORM子程序中捕获的类方法异常传递至PERFORM调用处?

在ABAP中将FORM子程序的异常传递至PERFORM调用处

方法1:重新抛出异常

如果类方法抛出的是基于cx_root的面向对象异常,可在FORM子程序的CATCH块中直接重新抛出异常,让PERFORM调用处捕获处理。

FORM process_data.
  TRY.
      " 调用会抛出异常的类方法
      cl_data_processor=>validate_input( ).
    CATCH cx_validation_failed INTO DATA(lo_exception).
      " 可选:在此记录异常日志或做前置处理
      RAISE EXCEPTION lo_exception. " 将异常传递到调用层
  ENDTRY.
ENDFORM.

" PERFORM调用处的异常处理
TRY.
    PERFORM process_data.
  CATCH cx_validation_failed INTO DATA(lo_caught_exc).
    WRITE: / '捕获到传递的异常:', lo_caught_exc->get_text( ).
ENDTRY.

方法2:通过子程序参数传递异常引用

若不想直接重新抛出,可在FORM定义时添加CHANGING参数,将捕获到的异常对象传递回调用处。

FORM process_data CHANGING co_exception TYPE REF TO cx_root.
  co_exception = NEW cx_root( ). " 初始化参数
  TRY.
      cl_data_processor=>validate_input( ).
    CATCH cx_root INTO co_exception.
      " 仅捕获异常,将对象赋值给输出参数
  ENDTRY.
ENDFORM.

" PERFORM调用处
DATA(lo_returned_exc) = NEW cx_root( ).
PERFORM process_data CHANGING lo_returned_exc.

IF lo_returned_exc IS BOUND AND lo_returned_exc IS NOT INITIAL.
  WRITE: / '从子程序传递的异常:', lo_returned_exc->get_text( ).
ENDIF.

注意事项

  • 重新抛出异常时,确保调用处的TRY-CATCH块能覆盖对应的异常类型(包括父类异常)。
  • 使用参数传递时,建议指定具体的异常类型(如cx_validation_failed)而非通用的cx_root,提升代码可读性和类型安全。

内容的提问来源于stack exchange,提问作者Bilal KOÇAK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:09:15