SAP/ABAP 接口中关于终止类型错误消息(A、E、X)的处理,使用CALL FUNCTION…EXCEPTIONS

SAP/ABAP 接口中关于终止类型错误消息(A、E、X)的处理,使用CALL FUNCTION…EXCEPTIONS

CALL FUNCTION func [EXCEPTIONS
[exc1= n1 exc2= n2]
[others= n_others] ]
[ERROR_MESSAGE = n_error].

exc1,exc2…与OTHERS异常只能捕获到MESSAGE…RAISING选项或RAISE语句抛出的异常,而error_message是无法捕获MESSAGE…RAISING与RAISE抛出的异常的

MESSAGE中的RAISING <exc1…exci>抛出异常时,如果在Call Function的Exception列表中有exc1…exci或others异常,则异常会优先被exc1…exci或others捕获到;否则RAISING选项将直接被忽略掉,MESSAGE会被error_message所捕获(在使用error_message捕获的前提下)

如果加了选项RAISING时:MESSAGE… RAISING ,此时的Message 的处理方式与是否显示,就要依赖于主调者在调用时,是否加上了exception 选项:

1、如果调用时没有带exception 选项,此时Message语包中的RAISING 选项抛出的异常将会被忽略,Message语句会当作正常消息来处理

2、 如果调用时加上了exception 选项对exc 异常进行了捕获,则不会再显示消息(但如果即使加上了exception选项,但没有捕获到exc异常,则此时会忽略RAISING选项),并设置sy-subrc。只要异常被捕获,相关消息内容将会入存入到SY-MSGID,SY-MSGTY, SY-MSGNO, and SY-MSGV1 to SY-MSGV4有关系统变量中。
在这里插入图片描述

输出结果:11

在这里插入图片描述
输出结果:88

在这里插入图片描述
输出结果:99

<think>我们正在处理一个关于SAP ABAP编程的问题。用户询问在`CALL FUNCTION`之后如何获取系统输出的消息(MESSAGE)。根据引用[1],我们知道SAP ABAP中函数模块可能会抛出异常,并且可能需要处理这些异常中的消息文本。 在ABAP中,当调用函数模块时,可以通过以下方式处理消息和异常: 1. 使用`EXCEPTIONS`子句捕获特定的异常,并通过`SY-SUBRC`检查返回码。 2. 如果要获取具体的消息文本,可以使用`MESSAGE ID`语句结合系统字段(如`SY-MSGID`, `SY-MSGNO`等)来获取,但通常这需要在函数内部处理。 然而,用户希望获取的是在`CALL FUNCTION`之后系统输出的消息。这里的消息可能是函数通过`MESSAGE`语句抛出的,这种消息会中断程序并显示在屏幕上。但有时我们希望以编程方式捕获这些消息而不是中断程序。 在ABAP中,我们可以使用以下方法: - 在函数调用时,通过`EXCEPTIONS`捕获异常,然后使用系统变量`SY-MSGID`, `SY-MSGNO`, `SY-MSGV1`, `SY-MSGV2`, `SY-MSGV3`, `SY-MSGV4`来构造消息文本。 - 另一种方法是使用`MESSAGE_TEXT`函数(函数模块`MESSAGE_TEXT_BUILD`)来根据消息ID和编号等获取消息文本。 但是,更直接的方法是在函数调用时捕获异常,然后使用`MESSAGE`语句的`INTO`子句将消息文本存储在变量中(注意:`MESSAGE ... INTO`只能在`CATCH`块或者通过`EXCEPTIONS`捕获到异常后使用)。 然而,需要注意的是,`MESSAGE ... INTO`语句在捕获消息时,要求消息类型必须是'A'(终止)、'E'(错误)、'W'(警告)或'I'(信息)。在函数调用中,如果函数抛出了异常,系统会自动设置消息字段,我们可以通过系统字段获取。 具体步骤: 1. 在`CALL FUNCTION`语句中,使用`EXCEPTIONS`来捕获异常,并为每个可能的异常指定一个返回码(非0)。 2. 调用函数后,检查`SY-SUBRC`。如果`SY-SUBRC`不为0(即发生了异常),则系统字段`SY-MSGID`、`SY-MSGNO`、`SY-MSGTY`(消息类型)以及`SY-MSGV1`到`SY-MSGV4`会被填充。 3. 然后,我们可以使用函数模块`MESSAGE_TEXT_BUILD`或者`FORMAT_MESSAGE`来将这些消息字段组合成完整的消息文本。 另外,引用[3]中展示了一个ABAP程序的代码模板,其中包含了`PERFORM FRM_USER_COMMAND`,这提示我们可能在子程序中处理命令,但与我们当前的问题不直接相关。 下面是一个示例代码,展示如何在调用函数后获取消息文本: ```abap DATA: lv_msg_text TYPE string. CALL FUNCTION 'Z_SOME_FUNCTION' EXPORTING ... " 输入参数 EXCEPTIONS error_occurred = 4 OTHERS = 8. IF sy-subrc <> 0. " 使用系统字段构建消息文本 MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_msg_text. " 现在 lv_msg_text 包含了完整的消息文本 WRITE: / 'Error:', lv_msg_text. ENDIF. ``` 在上面的代码中,如果函数`Z_SOME_FUNCTION`抛出了异常(例如,通过`RAISE error_occurred`或`MESSAGE E... RAISING error_occurred`),并且我们在`EXCEPTIONS`中指定了`error_occurred`对应返回码4,那么当`sy-subrc`为4时,我们使用`MESSAGE ... INTO`语句将消息文本存储到`lv_msg_text`中。 注意:`MESSAGE ... INTO`语句在这里不会显示消息,而是将消息文本存储到变量中。然后我们可以对这个变量进行后续处理(如显示、记录日志等)。 另外,如果函数内部使用了`MESSAGE`语句但没有使用`RAISING`选项,那么该消息会直接显示并可能导致程序中断(如果是A或X类型)。因此,在编写函数模块时,良好的实践是使用异常(通过`RAISING`)来传递错误,这样调用者可以通过异常处理机制来捕获。 如果函数模块没有定义异常,而是直接使用`MESSAGE E...`,那么调用时如果没有在`CALL FUNCTION`中使用`EXCEPTIONS`捕获,程序会终止。因此,为了以编程方式处理消息,我们需要在函数模块中定义异常,并在函数内部使用`MESSAGE ... RAISING <exception>`。 总结:在调用函数后获取消息文本的关键是: - 函数模块必须通过异常(RAISING)来传递消息。 - 调用程序中,通过EXCEPTIONS子句捕获异常。 - 使用系统字段和`MESSAGE ... INTO`来获取消息文本。 如果函数模块没有使用异常,而是直接输出消息(比如使用`MESSAGE`语句),那么我们必须修改函数模块以使用异常,或者使用其他方法(如包装函数)来捕获消息。但通常,标准的做法是使用异常。 因此,回答用户的问题:在CALL FUNCTION之后获取系统输出MESSAGE的代码写法,主要依赖于函数模块是否定义了异常。如果定义了,则按照上述代码示例处理;如果没有定义,可能需要调整函数模块的设计。 下面我们按照要求生成相关问题。 </think> 在 SAP ABAP 中,通过 `CALL FUNCTION` 调用函数模块后获取系统消息文本的标准方法如下: ### 核心实现步骤 1. **声明消息变量** 定义接收消息的结构体变量: ```abap DATA: lv_msg_type TYPE sy-msgty, "消息类型(E/W/I/S) lv_msg_id TYPE sy-msgid, "消息ID lv_msg_no TYPE sy-msgno, "消息编号 lv_msg_text TYPE string, "完整消息文本 lv_msg_v1 TYPE sy-msgv1, "占位符1 lv_msg_v2 TYPE sy-msgv2, "占位符2 lv_msg_v3 TYPE sy-msgv3, "占位符3 lv_msg_v4 TYPE sy-msgv4. "占位符4 ``` 2. **调用函数并捕获异常** 在 `CALL FUNCTION` 中使用 `EXCEPTIONS` 捕获错误: ```abap CALL FUNCTION 'Z_YOUR_FUNCTION' EXPORTING iv_param = 'Value' EXCEPTIONS error_occurred = 1 "触发异常时 sy-subrc = 1 OTHERS = 2. CASE sy-subrc. WHEN 1. "自定义异常处理 "系统自动填充 sy-msg* 字段 WHEN 2. "其他异常 "处理逻辑 ENDCASE. ``` 3. **提取消息文本** 通过 `FORMAT_MESSAGE` 函数组合完整消息: ```abap IF sy-subrc <> 0. "函数调用失败 CALL FUNCTION 'FORMAT_MESSAGE' EXPORTING id = sy-msgid lang = sy-langu no = sy-msgno v1 = sy-msgv1 v2 = sy-msgv2 v3 = sy-msgv3 v4 = sy-msgv4 IMPORTING msg = lv_msg_text. "获得完整消息文本 MESSAGE lv_msg_text TYPE 'I'. "显示消息(可选) ENDIF. ``` ### 关键说明 - **消息传递机制**:当函数中执行 `MESSAGE ... RAISING <exception>` 时,系统会自动填充 `SY-MSGID`、`SY-MSGNO` 等字段[^1]。 - **占位符处理**:`SY-MSGV1`~`SY-MSGV4` 携带消息中的动态变量(如文件名、行号等),需传递给 `FORMAT_MESSAGE` 生成可读文本。 - **消息类型**:根据 `SY-MSGTY` 判断消息级别: - `E`/`A`:错误(通常需中断流程) - `W`:警告 - `I`/`S`:信息 ### 完整示例代码 ```abap DATA: lv_msg_text TYPE string. CALL FUNCTION 'Z_MATERIAL_UPDATE' EXPORTING im_matnr = 'MAT001' EXCEPTIONS material_not_found = 1 update_failed = 2 OTHERS = 3. CASE sy-subrc. WHEN 1 OR 2 OR 3. CALL FUNCTION 'FORMAT_MESSAGE' EXPORTING id = sy-msgid no = sy-msgno v1 = sy-msgv1 v2 = sy-msgv2 v3 = sy-msgv3 v4 = sy-msgv4 IMPORTING msg = lv_msg_text. WRITE: / '错误消息:', lv_msg_text. WHEN 0. WRITE: / '函数执行成功'. ENDCASE. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

令狐九剑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值