如何将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
相关产品推荐
相关产品推荐

