"! abapGit general error CLASS zcx_abapgit_exception DEFINITION PUBLIC INHERITING FROM cx_static_check CREATE PUBLIC . PUBLIC SECTION. INTERFACES if_t100_message . DATA msgv1 TYPE symsgv READ-ONLY . DATA msgv2 TYPE symsgv READ-ONLY . DATA msgv3 TYPE symsgv READ-ONLY . DATA msgv4 TYPE symsgv READ-ONLY . DATA mt_callstack TYPE abap_callstack READ-ONLY . "! Raise exception with text "! @parameter iv_text | Text "! @parameter ix_previous | Previous exception "! @raising zcx_abapgit_exception | Exception CLASS-METHODS raise IMPORTING !iv_text TYPE clike !ix_previous TYPE REF TO cx_root OPTIONAL RAISING zcx_abapgit_exception . "! Raise exception with T100 message "!

"! Will default to sy-msg* variables. These need to be set right before calling this method. "!

"! @parameter iv_msgid | Message ID "! @parameter iv_msgno | Message number "! @parameter iv_msgv1 | Message variable 1 "! @parameter iv_msgv2 | Message variable 2 "! @parameter iv_msgv3 | Message variable 3 "! @parameter iv_msgv4 | Message variable 4 "! @raising zcx_abapgit_exception | Exception CLASS-METHODS raise_t100 IMPORTING VALUE(iv_msgid) TYPE symsgid DEFAULT sy-msgid VALUE(iv_msgno) TYPE symsgno DEFAULT sy-msgno VALUE(iv_msgv1) TYPE symsgv DEFAULT sy-msgv1 VALUE(iv_msgv2) TYPE symsgv DEFAULT sy-msgv2 VALUE(iv_msgv3) TYPE symsgv DEFAULT sy-msgv3 VALUE(iv_msgv4) TYPE symsgv DEFAULT sy-msgv4 RAISING zcx_abapgit_exception . METHODS constructor IMPORTING !textid LIKE if_t100_message=>t100key OPTIONAL !previous LIKE previous OPTIONAL !msgv1 TYPE symsgv OPTIONAL !msgv2 TYPE symsgv OPTIONAL !msgv3 TYPE symsgv OPTIONAL !msgv4 TYPE symsgv OPTIONAL . CLASS-METHODS raise_with_text IMPORTING !ix_previous TYPE REF TO cx_root RAISING zcx_abapgit_exception . METHODS get_source_position REDEFINITION . METHODS if_message~get_longtext REDEFINITION . PROTECTED SECTION. PRIVATE SECTION. CONSTANTS: gc_generic_error_msg TYPE string VALUE `An error occured (ZCX_ABAPGIT_EXCEPTION)` ##NO_TEXT. METHODS: save_callstack. ENDCLASS. CLASS ZCX_ABAPGIT_EXCEPTION IMPLEMENTATION. METHOD constructor ##ADT_SUPPRESS_GENERATION. super->constructor( previous = previous ). me->msgv1 = msgv1. me->msgv2 = msgv2. me->msgv3 = msgv3. me->msgv4 = msgv4. CLEAR me->textid. IF textid IS INITIAL. if_t100_message~t100key = if_t100_message=>default_textid. ELSE. if_t100_message~t100key = textid. ENDIF. save_callstack( ). ENDMETHOD. METHOD get_source_position. FIELD-SYMBOLS: TYPE abap_callstack_line. READ TABLE mt_callstack ASSIGNING INDEX 1. IF sy-subrc = 0. program_name = -mainprogram. include_name = -include. source_line = -line. ELSE. super->get_source_position( IMPORTING program_name = program_name include_name = include_name source_line = source_line ). ENDIF. ENDMETHOD. METHOD IF_MESSAGE~GET_LONGTEXT. " You should remember that we have to call ZCL_ABAPGIT_MESSAGE_HELPER " dynamically, because the compiled abapGit report puts the definition " of the exception classes on the top and therefore ZCL_ABAPGIT_MESSAGE_HELPER " isn't statically known DATA: lo_message_helper TYPE REF TO object. result = super->get_longtext( ). IF if_t100_message~t100key IS NOT INITIAL. CREATE OBJECT lo_message_helper TYPE ('ZCL_ABAPGIT_MESSAGE_HELPER') EXPORTING ii_t100_message = me. CALL METHOD lo_message_helper->('GET_T100_LONGTEXT') RECEIVING rv_longtext = result. 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. CALL METHOD ('ZCL_ABAPGIT_MESSAGE_HELPER')=>set_msg_vars_for_clike EXPORTING iv_text = 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 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. ls_t100_key-msgid = iv_msgid. ls_t100_key-msgno = iv_msgno. ls_t100_key-attr1 = 'MSGV1'. ls_t100_key-attr2 = 'MSGV2'. ls_t100_key-attr3 = 'MSGV3'. ls_t100_key-attr4 = 'MSGV4'. IF iv_msgid IS INITIAL. CLEAR ls_t100_key. ENDIF. RAISE EXCEPTION TYPE zcx_abapgit_exception EXPORTING textid = ls_t100_key msgv1 = iv_msgv1 msgv2 = iv_msgv2 msgv3 = iv_msgv3 msgv4 = iv_msgv4. ENDMETHOD. METHOD raise_with_text. raise( iv_text = ix_previous->get_text( ) ix_previous = ix_previous ). ENDMETHOD. METHOD save_callstack. FIELD-SYMBOLS: TYPE abap_callstack_line. CALL FUNCTION 'SYSTEM_CALLSTACK' IMPORTING callstack = mt_callstack. " You should remember that the first lines are from zcx_abapgit_exception " and are removed so that highest level in the callstack is the position where " the exception is raised. " " For the merged report it's hard to do that, because zcx_abapgit_exception " isn't visible in the callstack. Therefore we have to check the Events. LOOP AT mt_callstack ASSIGNING . IF -mainprogram CP |ZCX_ABAPGIT_EXCEPTION*| " full OR -blockname = `SAVE_CALLSTACK` " merged OR -blockname = `CONSTRUCTOR` " merged OR -blockname CP `RAISE*`. "merged DELETE TABLE mt_callstack FROM . ELSE. EXIT. ENDIF. ENDLOOP. ENDMETHOD. ENDCLASS.