12.[SAP ABAP] 异常处理
异常处理(Exception Handing)是程序设计中用于对运行时错误或异常情况的一种机制。它允许程序在发生异常时,不直接崩溃,而是捕捉异常并采取适当的措施(如记录日志、提示用户、重试操作等),从而提高程序的健壮性和用户体检。
在SAP ABAP中,异常处理是确保程序健壮性和错误恢复能力的重要机制。ABAP支持两种主要类型的异常:
- 经典异常(Classical Exceptions):主要用于较老的ABAP代码(如函数模块、子程序等)。
- 基于类的异常(Class-Base Exceptions):从SAP NetWeaver7.0开始引入,是现代ABAP推荐使用的异常处理方式。
一、基于类的异常(推荐)
1. 异常分类:
- CX_STATIC_CHECK:静态检查异常(必须显示处理或声明)。
- CX_DYNAMIC_CHECK:动态检查异常(运行时检查,可选处理)。
- CX_ROOT的直接子类(非CX_STATIC_CHECK/CX_DYNAMIC_CHECK):通常为运行时异常(如:CX_SY_CONVERSION_NO_NUMBER),无需显示处理。
2. 基础语法:
TRY. "可能引发异常的代码 CATCH cx_static_check INTO lx_error. "处理特定异常 CATCH cx_root INTO lx_general. "捕捉所有其他异常(可选) ENDTRY.3. 示例:
REPORT ZY_GOY_20251201. DATA: lv_result TYPE i, lv_divisor TYPE i VALUE 0, ex_ref TYPE REF TO cx_root. TRY. IF lv_divisor = 0. RAISE EXCEPTION TYPE cx_sy_zerodivide. ENDIF. lv_result = 999 / lv_divisor. CATCH cx_sy_zerodivide INTO ex_ref. WRITE: / '错误:除数不能为零'. CATCH cx_sy_arithmetic_overflow INTO ex_ref. WRITE: / '错误:算术溢出'. CATCH cx_root INTO ex_ref. " 捕获其他所有异常 WRITE: / '未知错误:', ex_ref->get_text( ). ENDTRY.4. 抛出异常(RAISE EXCEPTION):
RAISE EXCEPTION TYPE cx_z_custom_exception EXPORTING threadid = cx_z_custom_exception=>m_message.5. 自定义异常类:
可通过事务码SE24创建继承自CX_STATIC_CHECK或CX_DYNAMIC_CHECK的自定义异常类。
二、经典异常(旧式)
主要用于函数模块(Function Modules)和FORM子程序
函数模块中的异常
CALL FUNCTION 'FUNCTION_MODEL_NAME' EXPORTING ... EXCEPTIONS error_fir = 1 error_sen = 2 OTHERS = 3. IF sy-subrc <> 0. CASE sy-subrc. WHEN 1. WRITE: / 'Error 1 occurred'. WHEN 2. WRITE: / 'Error 2 occurred'. WHEN OTHERS. WRITE: / 'Other error'. ENDCASE. ENDIF.三、常用异常类
- cx_sy_zerodivide - 除零错误
- cx_sy_conversion_error - 类型转换错误
- cx_sy_arithmetic_overflow - 算术溢出
- cx_sy_dyn_call_error - 动态调用错误
- cx_sy_open_sql_db - 数据库错误
四、异常清理(CLEANUP)
TRY. " 可能引发异常的代码 CATCH cx_root INTO ex_ref. " 异常处理 CLEANUP. " 无论是否发生异常都会执行 " 用于清理资源 ENDTRY.五、嵌套TRY块
TRY. TRY. " 内部代码 CATCH cx_sy_zerodivide. " 内部异常处理 ENDTRY. " 外部异常处理 ENDTRY.六、最佳实践建议
- **具体异常优先:**先捕捉具体异常,最后用cx_root兜底。
- **资源清理:**使用CLEANUP块确保资源正确释放。
- **异常信息记录:**记录详细的异常信息以便异常。
- **避免空CATCH块:**至少记录或处理异常。
- **自定义异常:**为业务逻辑定义专门的异常类。