捕获 SUBMIT 语句的错误
Catch errors of SUBMIT statement
我有许多使用 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.
运行 后台报告不是一个选项,因为我需要结果。有没有办法从这个语句中捕获错误?
Is there a way to catch errors from this statement?
没有。 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.
- 将 SUBMIT 与
EXPORTING LIST TO MEMORY
子句一起使用,这样您就可以在不中断程序的情况下从假脱机中检索消息。
同意@suncatcher关于不,SUBMIT异常无法处理,外部会话失败(整个SUBMIT链,如果有的话,失败)并且外部会话从零重新启动(在显示发出的短转储之后来自未捕获的异常)。
也同意@florian 的观点,这是一个技巧,解决方案是纠正被零除的错误。
但是您可以在通过 RFC 打开的新外部会话中启动 SUBMIT,任何短转储都会 return 一个 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.
我有许多使用 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.
运行 后台报告不是一个选项,因为我需要结果。有没有办法从这个语句中捕获错误?
Is there a way to catch errors from this statement?
没有。 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.
- 将 SUBMIT 与
EXPORTING LIST TO MEMORY
子句一起使用,这样您就可以在不中断程序的情况下从假脱机中检索消息。
同意@suncatcher关于不,SUBMIT异常无法处理,外部会话失败(整个SUBMIT链,如果有的话,失败)并且外部会话从零重新启动(在显示发出的短转储之后来自未捕获的异常)。
也同意@florian 的观点,这是一个技巧,解决方案是纠正被零除的错误。
但是您可以在通过 RFC 打开的新外部会话中启动 SUBMIT,任何短转储都会 return 一个 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.