Fix exception texts (fixes #1242)

This commit is contained in:
Fabian Lupa 2018-03-17 12:51:29 +01:00
parent 7b002c66da
commit eac56ae802
3 changed files with 84 additions and 118 deletions

View File

@ -270,7 +270,7 @@ CLASS ZCL_ABAPGIT_GUI IMPLEMENTATION.
CATCH zcx_abapgit_exception INTO lx_exception.
ROLLBACK WORK.
MESSAGE lx_exception->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
MESSAGE lx_exception TYPE 'S' DISPLAY LIKE 'E'.
CATCH zcx_abapgit_cancel ##NO_HANDLER.
" Do nothing = gc_event_state-no_more_act
ENDTRY.

View File

@ -7,20 +7,13 @@ CLASS zcx_abapgit_exception DEFINITION
PUBLIC SECTION.
INTERFACES:
if_t100_message.
CONSTANTS:
BEGIN OF dummy,
msgid TYPE symsgid VALUE '02',
msgno TYPE symsgno VALUE '004',
attr1 TYPE scx_attrname VALUE 'MSGV1',
attr2 TYPE scx_attrname VALUE 'MSGV2',
attr3 TYPE scx_attrname VALUE 'MSGV3',
attr4 TYPE scx_attrname VALUE 'MSGV4',
END OF dummy.
CLASS-METHODS:
"! Raise exception with text
"! @parameter iv_text | Text
"! @parameter ix_previous | Previous exception
"! @raising zcx_abapgit_exception | Exception
raise IMPORTING iv_text TYPE clike
raise IMPORTING iv_text TYPE clike
ix_previous TYPE REF TO cx_root OPTIONAL
RAISING zcx_abapgit_exception,
"! Raise exception with T100 message
"! <p>
@ -43,15 +36,11 @@ CLASS zcx_abapgit_exception DEFINITION
METHODS:
constructor IMPORTING textid LIKE if_t100_message=>t100key OPTIONAL
previous LIKE previous OPTIONAL
text TYPE string OPTIONAL
subrc TYPE syst_subrc OPTIONAL
msgv1 TYPE syst_msgv OPTIONAL
msgv2 TYPE syst_msgv OPTIONAL
msgv3 TYPE syst_msgv OPTIONAL
msgv4 TYPE syst_msgv OPTIONAL,
if_message~get_text REDEFINITION.
msgv4 TYPE syst_msgv OPTIONAL.
DATA:
text TYPE string READ-ONLY,
subrc TYPE syst_subrc READ-ONLY,
msgv1 TYPE syst_msgv READ-ONLY,
msgv2 TYPE syst_msgv READ-ONLY,
@ -65,12 +54,10 @@ ENDCLASS.
CLASS zcx_abapgit_exception IMPLEMENTATION.
CLASS ZCX_ABAPGIT_EXCEPTION IMPLEMENTATION.
METHOD constructor ##ADT_SUPPRESS_GENERATION.
super->constructor( previous = previous ).
me->text = text.
me->subrc = subrc.
me->msgv1 = msgv1.
me->msgv2 = msgv2.
me->msgv3 = msgv3.
@ -84,45 +71,45 @@ CLASS zcx_abapgit_exception IMPLEMENTATION.
ENDIF.
ENDMETHOD.
METHOD if_message~get_text.
" The standard implementation of this method always uses T100 messages, if IF_T100_MESSAGE is
" implemented. Since this is a 'hybrid' exception of IF_MESSAGE and IF_T100_MESSAGE the normal
" get_text() is only called if a T100 message is used.
" Otherwise try to get a meaningful error text for the user in this order:
" mv_text variable, previous exception's text, generic error message
IF if_t100_message~t100key IS INITIAL OR
if_t100_message~t100key = if_t100_message=>default_textid.
IF text IS NOT INITIAL.
result = text.
ELSEIF previous IS NOT INITIAL.
result = previous->get_text( ).
ELSE.
IF sy-subrc IS NOT INITIAL.
result = |{ gc_generic_error_msg } ({ subrc })|.
ELSE.
result = gc_generic_error_msg.
ENDIF.
ENDIF.
ELSE.
result = super->get_text( ).
ENDIF.
ENDMETHOD.
METHOD raise.
DATA: lv_msgv1 TYPE symsgv,
lv_msgv2 TYPE symsgv,
lv_msgv3 TYPE symsgv,
lv_msgv4 TYPE symsgv,
ls_t100_key TYPE scx_t100key,
lv_text TYPE string.
IF iv_text IS INITIAL.
lv_text = gc_generic_error_msg.
ELSE.
lv_text = iv_text.
ENDIF.
cl_message_helper=>set_msg_vars_for_clike( lv_text ).
ls_t100_key-msgid = sy-msgid.
ls_t100_key-msgno = sy-msgno.
ls_t100_key-attr1 = 'MSGV1'.
ls_t100_key-attr2 = 'MSGV2'.
ls_t100_key-attr3 = 'MSGV3'.
ls_t100_key-attr4 = 'MSGV4'.
lv_msgv1 = sy-msgv1.
lv_msgv2 = sy-msgv2.
lv_msgv3 = sy-msgv3.
lv_msgv4 = sy-msgv4.
RAISE EXCEPTION TYPE zcx_abapgit_exception
EXPORTING
text = iv_text.
textid = ls_t100_key
msgv1 = lv_msgv1
msgv2 = lv_msgv2
msgv3 = lv_msgv3
msgv4 = lv_msgv4
previous = ix_previous.
ENDMETHOD.
METHOD raise_t100.
DATA: ls_t100_key TYPE scx_t100key,
lv_subrc TYPE syst_subrc.
" If this method is called right in the sy-subrc handling of a method or function module
" sy-subrc should still contain the id from that.
lv_subrc = sy-subrc.
DATA: ls_t100_key TYPE scx_t100key.
ls_t100_key-msgid = iv_msgid.
ls_t100_key-msgno = iv_msgno.
@ -131,7 +118,7 @@ CLASS zcx_abapgit_exception IMPLEMENTATION.
ls_t100_key-attr3 = 'MSGV3'.
ls_t100_key-attr4 = 'MSGV4'.
IF iv_msgid IS INITIAL OR iv_msgno IS INITIAL.
IF iv_msgid IS INITIAL.
CLEAR ls_t100_key.
ENDIF.
@ -141,7 +128,6 @@ CLASS zcx_abapgit_exception IMPLEMENTATION.
msgv1 = iv_msgv1
msgv2 = iv_msgv2
msgv3 = iv_msgv3
msgv4 = iv_msgv4
subrc = lv_subrc.
msgv4 = iv_msgv4.
ENDMETHOD.
ENDCLASS.

View File

@ -23,6 +23,8 @@ CLASS ltcl_test DEFINITION
msgv4 TYPE syst_msgv,
END OF gty_t100_message.
CLASS-METHODS:
get_exc_text IMPORTING ix_ex TYPE REF TO cx_root
RETURNING VALUE(rv_text) TYPE string,
get_t100_text IMPORTING is_message TYPE gty_t100_message
RETURNING VALUE(rv_text) TYPE string.
ENDCLASS.
@ -34,36 +36,22 @@ CLASS ltcl_test IMPLEMENTATION.
DATA: lx_ex TYPE REF TO zcx_abapgit_exception,
lx_previous TYPE REF TO cx_root.
CREATE OBJECT lx_ex
EXPORTING
text = lc_text1.
TRY.
CREATE OBJECT lx_previous TYPE cx_sy_dyn_call_illegal_method
EXPORTING
textid = cx_sy_dyn_call_illegal_method=>private_method
classname = 'CLASS'
methodname = 'METHOD'.
cl_abap_unit_assert=>assert_equals( act = lx_ex->get_text( ) exp = lc_text1 ).
zcx_abapgit_exception=>raise( iv_text = lx_previous->get_text( )
ix_previous = lx_previous ).
cl_abap_unit_assert=>fail( ).
FREE lx_ex.
CREATE OBJECT lx_ex
EXPORTING
text = lc_text2.
cl_abap_unit_assert=>assert_equals( act = lx_ex->get_text( )
exp = zcx_abapgit_exception=>gc_generic_error_msg ).
FREE lx_ex.
CREATE OBJECT lx_previous TYPE cx_sy_dyn_call_illegal_method
EXPORTING
textid = cx_sy_dyn_call_illegal_method=>private_method
classname = 'CLASS'
methodname = 'METHOD'.
CREATE OBJECT lx_ex
EXPORTING
text = lc_text2
previous = lx_previous.
cl_abap_unit_assert=>assert_equals( act = lx_ex->get_text( )
exp = lx_previous->get_text( ) ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex )
exp = lx_previous->get_text( ) ).
cl_abap_unit_assert=>assert_equals( act = lx_ex->previous exp = lx_previous ).
ENDTRY.
FREE: lx_ex, lx_previous.
@ -71,7 +59,7 @@ CLASS ltcl_test IMPLEMENTATION.
zcx_abapgit_exception=>raise( lc_text1 ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = lx_ex->get_text( ) exp = lc_text1 ).
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex ) exp = lc_text1 ).
ENDTRY.
FREE lx_ex.
@ -80,8 +68,9 @@ CLASS ltcl_test IMPLEMENTATION.
zcx_abapgit_exception=>raise( lc_text2 ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = lx_ex->get_text( )
exp = zcx_abapgit_exception=>gc_generic_error_msg ).
cl_abap_unit_assert=>assert_equals(
act = get_exc_text( lx_ex )
exp = zcx_abapgit_exception=>gc_generic_error_msg ).
ENDTRY.
FREE lx_ex.
@ -90,10 +79,14 @@ CLASS ltcl_test IMPLEMENTATION.
METHOD test_no_text.
DATA: lx_ex TYPE REF TO zcx_abapgit_exception.
CREATE OBJECT lx_ex.
cl_abap_unit_assert=>assert_equals( act = lx_ex->get_text( )
exp = zcx_abapgit_exception=>gc_generic_error_msg ).
TRY.
zcx_abapgit_exception=>raise( space ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals(
act = get_exc_text( lx_ex )
exp = zcx_abapgit_exception=>gc_generic_error_msg ).
ENDTRY.
ENDMETHOD.
METHOD test_t100_text.
@ -160,15 +153,7 @@ CLASS ltcl_test IMPLEMENTATION.
msgv2 TYPE syst_msgv VALUE IS INITIAL,
msgv3 TYPE syst_msgv VALUE IS INITIAL,
msgv4 TYPE syst_msgv VALUE IS INITIAL,
END OF lc_msg8,
BEGIN OF lc_msg9,
msgid TYPE syst_msgid VALUE '!"(/&&(%!)"(',
msgno TYPE syst_msgno VALUE '000',
msgv1 TYPE syst_msgv VALUE IS INITIAL,
msgv2 TYPE syst_msgv VALUE IS INITIAL,
msgv3 TYPE syst_msgv VALUE IS INITIAL,
msgv4 TYPE syst_msgv VALUE IS INITIAL,
END OF lc_msg9.
END OF lc_msg8.
DATA: lx_ex TYPE REF TO zcx_abapgit_exception,
lv_text TYPE string.
@ -177,7 +162,7 @@ CLASS ltcl_test IMPLEMENTATION.
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = lx_ex->get_text( ) exp = lv_text ).
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex ) exp = lv_text ).
ENDTRY.
CLEAR lv_text.
@ -188,7 +173,7 @@ CLASS ltcl_test IMPLEMENTATION.
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = lx_ex->get_text( ) exp = lv_text ).
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex ) exp = lv_text ).
ENDTRY.
CLEAR lv_text.
@ -199,7 +184,7 @@ CLASS ltcl_test IMPLEMENTATION.
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = lx_ex->get_text( ) exp = lv_text ).
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex ) exp = lv_text ).
ENDTRY.
CLEAR lv_text.
@ -210,7 +195,7 @@ CLASS ltcl_test IMPLEMENTATION.
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = lx_ex->get_text( ) exp = lv_text ).
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex ) exp = lv_text ).
ENDTRY.
CLEAR lv_text.
@ -221,7 +206,7 @@ CLASS ltcl_test IMPLEMENTATION.
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = lx_ex->get_text( ) exp = lv_text ).
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex ) exp = lv_text ).
ENDTRY.
CLEAR lv_text.
@ -232,7 +217,7 @@ CLASS ltcl_test IMPLEMENTATION.
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = lx_ex->get_text( ) exp = lv_text ).
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex ) exp = lv_text ).
ENDTRY.
CLEAR lv_text.
@ -243,7 +228,7 @@ CLASS ltcl_test IMPLEMENTATION.
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = lx_ex->get_text( ) exp = lv_text ).
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex ) exp = lv_text ).
ENDTRY.
CLEAR lv_text.
@ -254,23 +239,18 @@ CLASS ltcl_test IMPLEMENTATION.
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = lx_ex->get_text( ) exp = lv_text ).
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex ) exp = lv_text ).
ENDTRY.
CLEAR lv_text.
FREE lx_ex.
ENDMETHOD.
TRY.
lv_text = get_t100_text( lc_msg9 ).
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = lx_ex->get_text( )
exp = zcx_abapgit_exception=>gc_generic_error_msg ).
ENDTRY.
CLEAR lv_text.
FREE lx_ex.
METHOD get_exc_text.
cl_message_helper=>set_msg_vars_for_if_msg( ix_ex ).
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
INTO rv_text.
ENDMETHOD.
METHOD get_t100_text.