[ABAP] OO: Lokale Exception-Klasse anlegen, auslösen und behandeln, Nutzung des Interfaces if_t100_message

* http://havliczech.blogspot.com/2014/07/local-exception-class-message.html

* lokale Exceptionklasse
CLASS lcx_my_exception DEFINITION INHERITING FROM cx_static_check FINAL CREATE PUBLIC.
  PUBLIC SECTION.

* von Interface if_t100_message ableiten
    INTERFACES if_t100_message.

    DATA: methname TYPE string READ-ONLY ##NEEDED.
    DATA: msg      TYPE string READ-ONLY ##NEEDED.
    DATA: code     TYPE char2  READ-ONLY ##NEEDED.

    METHODS constructor
      IMPORTING methname TYPE sys_calls-eventname
                msg      TYPE string
                code     TYPE char2.
ENDCLASS.

CLASS lcx_my_exception IMPLEMENTATION.

* Übergabe der Parameter erfolgt im Conructor
  METHOD constructor.
    super->constructor( ).

    me->methname = methname.
    me->msg      = msg.
    me->code     = code.

* Standard Message-Typ verwenden: & & & &
    me->if_t100_message~t100key-msgid = 'SY'.
    me->if_t100_message~t100key-msgno = '499'.
    me->if_t100_message~t100key-attr1 = 'METHNAME'.
    me->if_t100_message~t100key-attr2 = 'MSG'.
    me->if_t100_message~t100key-attr3 = 'CODE'.
    me->if_t100_message~t100key-attr4 = ''.
  ENDMETHOD.

ENDCLASS.

* Testklasse zum Auslösen der Exception
CLASS lcl_demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      div
        IMPORTING i_val1        TYPE f
                  i_val2        TYPE f
        RETURNING VALUE(rv_ret) TYPE f
* Propagieren der Exception
        RAISING   lcx_my_exception.
ENDCLASS.

CLASS lcl_demo IMPLEMENTATION.
  METHOD div.
    IF i_val2 = '0.0'.
* Wenn durch 0.0 geteilt werden soll: Auslösen der lokalen Exception, zusätzlichen Parameter übergeben
      RAISE EXCEPTION TYPE lcx_my_exception
        EXPORTING
          methname = 'DIV'
          msg      = 'Division durch 0'
          code     = 'DD'.
    ELSE.
      rv_ret = i_val1 / i_val2.
    ENDIF.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  TRY.
* durch 0.0 teilen -> Exception wird ausgelöst
      WRITE: / lcl_demo=>div( i_val1 = '1.1'
                              i_val2 = '0.0' ).
* Abfangen der lokalen Exception
    CATCH lcx_my_exception INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.

[ABAP] OO: Lokale Exception-Klasse anlegen, auslösen und behandeln

* lokale Exception-Klasse, erbt von cx_static_check
CLASS lcx_my_exception DEFINITION INHERITING FROM cx_static_check FINAL CREATE PUBLIC.
  PUBLIC SECTION.

* eigener Konstruktor mit zus. Parameter field_info
    METHODS: constructor
      IMPORTING
        !textid    LIKE textid OPTIONAL
        !previous  LIKE previous OPTIONAL
        field_info TYPE string OPTIONAL.

* neue Methode
    METHODS:
      get_fieldinfo
        RETURNING VALUE(re_field_info) TYPE string.

  PRIVATE SECTION.
    DATA: gv_field_info TYPE string.
ENDCLASS.

CLASS lcx_my_exception IMPLEMENTATION.
  METHOD constructor.
    super->constructor( textid = textid
                        previous = previous ).

    gv_field_info = field_info.
  ENDMETHOD.

  METHOD get_fieldinfo.
    re_field_info = gv_field_info.
  ENDMETHOD.
ENDCLASS.

CLASS lcl_demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      div
        IMPORTING i_val1        TYPE f
                  i_val2        TYPE f
        RETURNING VALUE(rv_ret) TYPE f
* Propagieren der Exception
        RAISING   lcx_my_exception.
ENDCLASS.

CLASS lcl_demo IMPLEMENTATION.
  METHOD div.
    IF i_val2 = '0.0'.
* Wenn durch 0.0 geteilt werden soll: Auslösen der lokalen Exception, zusätzlichen Parameter übergeben
      RAISE EXCEPTION TYPE lcx_my_exception
        EXPORTING
          field_info = 'Neue Feldinfo.'.
    ELSE.
      rv_ret = i_val1 / i_val2.
    ENDIF.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  TRY.
* durch 0.0 teilen -> Exception wird ausgelöst
      WRITE: / lcl_demo=>div( i_val1 = '1.1'
                              i_val2 = '0.0' ).
* Abfangen der lokalen Exception
    CATCH lcx_my_exception INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
* zusätzlichen Parameter holen
      WRITE: / e_txt->get_fieldinfo( ).
  ENDTRY.