Поймать ошибки оператора SUBMIT - PullRequest
0 голосов
/ 24 августа 2018

У меня есть ряд программ 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.

Запуск отчета в фоновом режиме не вариант, потому что мне нужен результат. Есть ли способ отловить ошибки из этого утверждения?

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Согласовано с @suncatcher о нет, исключения SUBMIT не могут быть обработаны, внешний сеанс завершается неудачно (вся цепочка SUBMIT, если таковая имеется, происходит сбой), а внешний сеанс перезапускается с нуля (после отображения короткого дампа, выданного из неисследованное исключение).

Также согласился с @florian, что это хитрость, и решение состоит в том, чтобы исправить ошибку деления на ноль.

Но вы можете запустить SUBMIT в новом внешнем сеансе, открытом через RFC, любой короткий дамп вернет исключение 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.
0 голосов
/ 24 августа 2018

Есть ли способ отловить ошибки из этого оператора?

Нет. 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.
    

enter image description here

  1. Использовать SUBMIT с предложением EXPORTING LIST TO MEMORY, которое позволяет извлекать сообщения из очереди без прерывания работы программы.
...