我有许多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.
在后台运行报告不是一种选择,因为我需要结果。有没有办法从此语句中捕获错误?
答案 0 :(得分:2)
与@suncatcher达成协议,否,无法处理SUBMIT异常,外部会话失败(整个SUBMIT链,如果有的话,则失败),并且外部会话从零重新启动(显示了从未捕获的异常)。
也同意@florian的说法,这是一个技巧,解决方案是纠正除以零的bug。
但是您可以在通过RFC打开的新的外部会话中启动SUBMIT,任何短暂的转储都会返回SYSTEM_FAILURE异常:
1)创建一个启用Z RFC的功能模块,并将其提交给其他程序
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.
答案 1 :(得分:0)
有没有一种方法可以捕获此语句中的错误?
不。 SUBMIT仅生成non-handleable exceptions,即使在文档中也提到了COMPUTE_INT_ZERODIVIDE作为示例。阅读有关ABAP异常概念的更多信息。
这里唯一的解决方案是:
将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.
EXPORTING LIST TO MEMORY
子句的SUBMIT,它使您可以在不中断程序的情况下从假脱机中检索消息。