Разберем несколько операторов в блокe TRY... ENDTRY.
Retry - позволяет выполнить блок TRY еще раз. Перед перезапуском блока необходимо исправить ситуацию, из-за которой случилась ошибка. В противном случае, попадем в бесконечный цикл.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
types: begin of gty_s_fio, pernr type text8, "в тестовой системе нет hr типов fio type text100, bukrs type bukrs, end of gty_s_fio. data gt_fio type table of gty_s_fio. try. data(gs_data) = gt_fio[ bukrs = '0001' ]. catch cx_root. append value #( pernr = '90000001' fio = 'Ivanov I.I.' bukrs = '0001' ) to gt_fio. retry. endtry. |
RESUME - возобновляемое исключение. Программа возвращается к работе после исключения.
1 2 3 4 5 6 7 8 9 10 11 12 |
class cx_exp definition inheriting from cx_static_check. endclass. try. data(lo_exc) = new cx_exp( ) . data(lo_out) = cl_demo_output=>new( )->write( 'Start' ). raise resumable exception lo_exc. lo_out->write( 'Возврат в обработку' ). catch BEFORE UNWIND cx_exp. lo_out->write( 'Блок catch' ). resume. endtry. lo_out->display( ). |
CLEANUP - этот оператор который находится в блоке TRY...ENDTRY и выполняется, если исключение не обрабатывается непосредственно в текущем блоке, а мы его ловим в блоке выше .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
class lcl_test_cleanup definition. public section. methods: constructor, run returning value(ro_test_cleanup) type ref to lcl_test_cleanup, display returning value(ro_test_cleanup) type ref to lcl_test_cleanup. private section. types: begin of mty_s_fio, pernr type text8, "в тестовой системе нет hr типов fio type text100, bukrs type bukrs, end of mty_s_fio. methods: inside_method. data mo_out type ref to if_demo_output. data mt_fio2 type table of mty_s_fio. endclass. class lcl_test_cleanup implementation. method run. try. inside_method( ). catch cx_root. mo_out->write( 'Ошибка перехвачена' ). endtry. ro_test_cleanup = me. endmethod. method inside_method. try. data(ls_data2) = mt_fio2[ bukrs = '0001' ]. catch cx_sy_open_sql_db. "Допустим ждали эту cleanup. mo_out->write( ' CLEANUP Отработало' ). endtry. endmethod. method display. mo_out->display( ). ro_test_cleanup = me. endmethod. method constructor. mo_out = cl_demo_output=>new( ). endmethod. endclass. start-of-selection. data(lo_test) = new lcl_test_cleanup( )->run( )->display( ). |
Более подробно можно посмотреть в хэлпе.
Программа с примерами - DEMO_CATCH_EXCEPTION