如何捕获`MESSAGE RAISING`类型异常?

问题描述 投票:0回答:3

给出一个经典的 ABAP 异常,如下所示:

MESSAGE ID 'XYZ' TYPE 'E' NUMBER 123 RAISING exception_name

如何在调用代码中捕获此异常?

我尝试过

try
/
catch
CASE sy-subrc
CATCH SYSTEM-EXCEPTIONS
(这甚至不再编译,因为它已经过时了),但它们都不起作用。程序立即退出并在 SAPGUI 左下角显示错误消息。

exception try-catch abap
3个回答
2
投票

解决方案在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 文档

参考:

    非基于类的异常
  • 提出/声明
      • 留言...提高...
      • 提高...(不提高异常...)
      • [类别]方法 ... 例外 exc1 exc2 ...
      • 功能模块接口-异常
      拦截、处理
    • 方法
        • meth( 或调用方法 ... 例外 exc1 = n1 exc2 = n2 ... [其他 = n_others]
        • .
        功能模块

0
投票
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.



0
投票
经典异常在 EXCEPTIONS 选项卡中声明
  1. 通过Pattern->CALL FUNCTION添加FM,因此所有类型的参数都添加了IMPORTS、EXPORTS..和EXCEPTIONS。
  2. 通过分配连续编号(可以更改)来列出例外情况。如果发生,该数字将返回到变量 SY-SUBRC 中。
  3. 测试SY-SUBRC,如果不等于0则发生异常(相当于返回的数字)。
© www.soinside.com 2019 - 2024. All rights reserved.