【问题标题】:Catch errors of SUBMIT statement捕捉 SUBMIT 语句的错误
【发布时间】:2022-04-22 00:00:48
【问题描述】:

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

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.

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

【问题讨论】:

  • 也许是个愚蠢的问题,但你能控制被调用的程序吗?如题,你能编辑它的源代码吗?
  • 很遗憾,没有。

标签: abap


【解决方案1】:

同意@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.

【讨论】:

    【解决方案2】:

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

    没有。 SUBMIT 只产生non-handleable exceptions,甚至在文档中也提到了 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 与 EXPORTING LIST TO MEMORY 子句一起使用,这样您就可以在不中断程序的情况下从假脱机中检索消息。

    【讨论】:

    • 我同意 CALL TRANSACTION USING 将返回一条消息,指出存在运行时错误,但如果被调用程序出现运行时错误,任何 SUBMIT(无论您使用什么变体)都会立即终止调用程序。
    • will terminate immediately the calling program if the called program has a runtime error 错误。您是否尝试过变体 1?在我的系统上,它完美地将转储捕获到 messtab 中并且循环不会中断。我添加了messtab的截图。
    • 它实际上是后台处理(批处理模式),所以它不是 OP 想要的,但它是一个选项,它可以完成工作。
    • 很抱歉造成误解,我完全同意第1点(CALL TRANSACTION USING)。我的观点是关于第 2 点, SUBMIT 立即终止, SUBMIT EXPORTING LIST TO MEMORY 并不意味着它用于 background job ;您应该明确提及“在后台作业中运行程序并等待其结束”之类的内容(即使用 SUBMIT VIA JOB + 循环等待表 TBTCO,列 STATUS 查询失败或成功);关于 EXPORTING LIST TO MEMORY,我认为保留 OP 的确切上下文并不重要,这样可以使答案更笼统。
    猜你喜欢
    • 1970-01-01
    • 2010-12-05
    • 2020-11-09
    • 2013-10-12
    • 1970-01-01
    • 2020-04-02
    • 2011-01-30
    • 2012-04-21
    • 2014-03-25
    相关资源
    最近更新 更多