给出一个经典的 ABAP 异常,如下所示:
MESSAGE ID 'XYZ' TYPE 'E' NUMBER 123 RAISING exception_name
如何在调用代码中捕获此异常?
我尝试过
try
/catch
、CASE sy-subrc
和CATCH SYSTEM-EXCEPTIONS
(这甚至不再编译,因为它已经过时了),但它们都不起作用。程序立即退出并在 SAPGUI 左下角显示错误消息。
解决方案在MESSAGE、RAISING的ABAP文档中有说明:
如果在处理方法或功能模块(其调用者使用语句 CALL 的添加 EXCEPTIONS 将返回值分配给 exception 异常)的过程中执行 MESSAGE 语句并添加 RAISING,则该语句具有相同的效果正如语句“RAISE”一样。
在异常链接中,可以看到处理章节:
非基于类的异常的处理是通过在方法调用和功能模块调用中添加
EXCEPTIONS
来实现的,方法是为异常分配数值,这些值用于在异常发生时填充系统字段sy-subrc
引发异常。实际的错误处理发生在调用之后,当评估时。 如果异常是在功能模块(或该功能模块内的子例程)内引发的,您可以这样处理:sy-subrc
CALL FUNCTION '...'
EXCEPTIONS
exception_name = 1.
IF sy-subrc = 1.
" handling of exception_name
ENDIF.
如果异常是在方法内部引发的,您可以这样处理:
cl_foo=>bar( EXCEPTIONS exception_name = 1 ).
IF sy-subrc = 1.
" handling of exception_name
ENDIF.
特殊异常名称
OTHERS
可用于不提及所有异常名称。
请注意,这些“非基于类的异常”已过时,它们“不应在新开发中再定义”。相反,您应该使用基于类的异常(其工作方式不同)。
所有非基于类的异常主题的 ABAP 文档参考:
cl_foo=>bar
中引发的。您可以通过
EXCEPTIONS
关键字在函数调用中指定选项来捕获异常。请拨打 CASE sy-subrc
电话跟进。例如:
cl_foo=>bar( EXCEPTIONS foo1 = 1
foo2 = 2
foo3 = 3
OTHERS = 4 ).
CASE sy-subrc.
WHEN 0.
WRITE: / |Success|.
WHEN OTHERS.
WRITE: / |Error|.
ENDCASE.