[ABAP] Fehlermeldungen über die Standard-Exceptionklasse CX_T100_MSG ausgeben

* Auslösen der Exeption CX_T100_MSG
CLASS zxyz DEFINITION FINAL.

  PUBLIC SECTION.

    METHODS: constructor
      IMPORTING
        !iv_text TYPE string " Übergabestring für Test
      RAISING
        cx_t100_msg.         " Fehler im Konstruktor löst evtl. CX_T100_MSG aus

ENDCLASS.

CLASS zxyz IMPLEMENTATION.
  METHOD constructor.

    IF NOT iv_text IS INITIAL.

      ...

    ELSE.
* Wenn iv_text leer -> CX_T100_MSG auslösen
      RAISE EXCEPTION TYPE cx_t100_msg
        EXPORTING
          t100_msgid = '00'
          t100_msgno = '398'
          t100_msgv1 = 'Text war leer.' " 1. String
          t100_msgv2 = ''               " 2. String
          t100_msgv3 = ''               " 3. String
          t100_msgv4 = ''.              " 4. String
    ENDIF.

  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
* Exception CX_T100_MSG abfangen
  TRY.
* zum Auslösen der Exception den Übergabeparameter leer lassen
      DATA(o_test) = NEW zxyz( iv_text = '' ).
* Exception abfangen
    CATCH cx_root INTO DATA(e_txt).
* Klassenname
      WRITE: / cl_abap_classdescr=>get_class_name( p_object = e_txt ).
* Messagetext
      WRITE: / e_txt->get_text( ).
  ENDTRY.

[ABAP] vordefinierte Ausnahmeklassen (Exception-Klassen) im System

Eine schöne Übersicht zu System-Exception-Klassen findet sich hier: Link

* häufig verwendete System-Ausnahmeklassen:

CX_ROOT
CX_SY_ARITHMETIC_ERROR
CX_SY_ZERODIVIDE
CX_SY_CREATE_OBJECT_ERROR
CX_SY_FILE_ACCESS_ERROR
CX_SY_ITAB_LINE_NOT_FOUND
CX_SY_SQL_ERROR

[ABAP] Objektorientiertes (OO) Exceptionhandling mit TRY … CATCH

Variante 1 (implizites Erzeugen von Objekten)

* DEMO_CATCH_EXCEPTION

START-OF-SELECTION.
  TRY.
      RAISE EXCEPTION TYPE cx_sy_zerodivide.
* Exception abfangen
    CATCH cx_sy_zerodivide INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

Variante 2 (explizites Erzeugen von Objekten)

START-OF-SELECTION.
  TRY.
      DATA(excp) = NEW cx_os_object_not_found( classname = 'MYCLASS' ).
      RAISE EXCEPTION excp.
* Exception abfangen
    CATCH cx_os_object_not_found INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

Variante 3 (explizites Erzeugen von Objekten – RE-RAISING)

START-OF-SELECTION.
  TRY.
      TRY.
          DATA(excp) = NEW cx_sy_file_open( filename = 'xyz.txt' ).
          RAISE EXCEPTION excp.
* Exception abfangen
        CATCH cx_root INTO DATA(exc).
* RE-RAISING einer neuen Exception
          RAISE EXCEPTION TYPE cx_sy_file_position
            EXPORTING
              previous = exc.
      ENDTRY.
* Exception abfangen
    CATCH cx_root INTO DATA(exc2).
      MESSAGE exc2->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

Variante 4 (Runtime Exceptions)

START-OF-SELECTION.
  TRY.
* implizites Erzeugen von Exception cx_sy_zerodivide
      DATA(erg) = 1 / 0.
* Exception abfangen
    CATCH cx_root INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

Variante 5 (Beispiel – Definition und Auslösen einer OO-Exception)

CLASS my_class DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS: my_method
* Exception propagieren
      RAISING cx_sy_zerodivide.
ENDCLASS.
 
CLASS my_class IMPLEMENTATION.
  METHOD my_method.
    ...
* Auslösen der Systemexception cx_sy_zerodivide
    RAISE EXCEPTION TYPE cx_sy_zerodivide.
    ...
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
* Behandlung einer OO-Exception
  TRY.
* Funktionsaufruf, der Exception cx_sy_zerodivide auslösen kann
      my_class=>my_method( ).
* Exception cx_sy_zerodivide abfangen
    CATCH cx_sy_zerodivide INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

Weiterführende Information: Link und Link