0

我有许多使用动态调用的 ABAP 程序submit。为了确保它能够运行,我首先进行语法检查。

syntax-check for program programName message error line location word word.
if ( sy-subrc = 0 ).
  submit (programName) exporting list to memory and return.
endif.

我遇到的问题是由于逻辑错误。其中一个程序最终试图将一个数字除以零。我不知道为什么或者是否可以修复该错误,但我想做的是能够优雅地告诉我的应用程序发生了错误,而不是让整个应用程序停止。

为了论证起见,假设程序是:

report.
data(holeInEarth) = 1 / 0.

我尝试使用 try catch 块,但如果发生错误,则不会发生任何事情。

try.
    submit (programName) exporting list to memory and return.
catch cx_root into (err).
    ...do something with err...
endtry.

我也尝试使用catch system-exceptions.

catch system-exceptions others = 1.
    submit (programName) exporting list to memory and return.
endcatch.

在后台运行报告不是一个选项,因为我需要结果。有没有办法从这个语句中捕获错误?

4

2 回答 2

3

同意@suncatcher 关于否,无法处理 SUBMIT 异常,外部会话失败(整个 SUBMIT 链,如果有的话,失败)并且外部会话从零重新启动(在显示从未捕获的异常发出的短转储之后) .

也同意@florian 这是一个技巧,解决方案是纠正除以零错误。

但是您可以在通过 RFC 打开的新外部会话中启动 SUBMIT,任何简短的转储都将返回 SYSTEM_FAILURE 异常:

1)创建一个Z RFC-enabled功能模块,并使其提交其他程序

SUBMIT ... WITH ... " eventual parameters

2)从你的程序中调用它

CALL FUNCTION 'Z...'  " will do the SUBMIT
    DESTINATION 'NONE'
    EXPORTING ... " eventual parameters
    EXCEPTIONS
      SYSTEM_FAILURE = 1.
IF sy-subrc = 1.
  " there was a short dump
ENDIF.
于 2018-08-25T17:33:58.477 回答
0

有没有办法从这个语句中捕获错误?

不。 SUBMIT 只产生不可处理的异常,即使在文档中也提到了 COMPUTE_INT_ZERODIVIDE 作为示例。阅读有关 ABAP 异常概念的更多信息。

这里唯一的解决方案是:

  1. 将 SUBMIT 包装到 CALL TRANSACTION 语句中并将错误收集到选项卡中

    CALL TRANSACTION 'MEQ1' USING i_bdcdata MODE 'N'
                      MESSAGES INTO i_messtab.
    

    你可以做这样的事情

    TYPES t_itab TYPE STANDARD TABLE OF char5
                          WITH DEFAULT KEY.
    
    DATA: messtab TYPE TABLE OF bdcmsgcoll,
          i_bdcdata TYPE TABLE OF bdcdata_tab.
    
    DATA(tab) = VALUE t_itab( ( 'MM03' ) ( 'Z0001' ) ( 'MIGO' ) ).
    
    LOOP AT tab ASSIGNING FIELD-SYMBOL(<fs>).
    CALL TRANSACTION <fs> USING i_bdcdata MODE 'N'
                                MESSAGES INTO messtab.
    ENDLOOP.
    

在此处输入图像描述

  1. 使用 SUBMIT withEXPORTING LIST TO MEMORY子句,它允许您在不中断程序的情况下从假脱机中检索消息。
于 2018-08-24T19:55:00.237 回答