Допустим есть метод, который принимает строку и возвращает из нее число. Тип возвращаемого числа DECFLOAT34, чтобы влезло как можно больше. Результат метода присваивается переменной имеющей меньшую разрядность. В случае, когда итоговый результат превышает максимально возможный для этого типа переменной, должно выбрасываться CX_SY_CONVERSION_OVERFLOW. Это вроде как все учтено.
При присвоении результата вызова метода напрямую в переменную CX_SY_CONVERSION_OVERFLOW не ловится и лезет дамп.
Но, если переписать присвоение через промежуточную переменную, CX_SY_CONVERSION_OVERFLOW ловится, дампа нет.
В чем прикол?
REPORT ztest_overflow.
DATA gv_value TYPE string VALUE '123456789123456'.
DATA gv_wrbtr TYPE wrbtr_d.
CLASS lcl_test DEFINITION.
PUBLIC SECTION.
CLASS-METHODS convert
IMPORTING iv_value TYPE clike
RETURNING VALUE(rv_value) TYPE decfloat34
RAISING cx_static_check.
ENDCLASS.
CLASS lcl_test IMPLEMENTATION.
METHOD convert.
DATA(lv_value) = iv_value.
DO 2 TIMES.
TRY .
rv_value = lv_value.
EXIT.
CATCH cx_root INTO DATA(lx_error).
IF sy-index = 1.
TRANSLATE lv_value USING ',..,'.
ELSE.
RAISE EXCEPTION TYPE cx_sral.
ENDIF.
ENDTRY.
ENDDO.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
BREAK-POINT.
TRY .
DATA(lv_value) = lcl_test=>convert( gv_value ).
gv_wrbtr = lv_value.
CATCH cx_root.
WRITE 'Overflow'. NEW-LINE.
ENDTRY.
TRY .
gv_wrbtr = lcl_test=>convert( gv_value ). "!!!!DUMP
CATCH cx_root.
WRITE 'Overflow'. NEW-LINE.
ENDTRY.