Übung Schrödinger: 11 Ausnahmen (ABAP)

Aus MattWiki

Ausnahmen können auf drei wegen erzeugt werden:

  1. EXCEPTIONS-Parameter abfangen mit SY-SUBRC
  2. CATCH SYSTEM-EXCEPTIONS (Obsolet)
  3. TRY-CATCH-Ausnahmebehandlung mit Ausnahmeklasse

Nachfolgend finden sich drei Listings aus den Übungsaufgaben zum Thema Ausnahmen aus Kapitel 11 des Buchs "Schrödinger programmiert ABAP".

EXCEPTIONS mit SUBRC

REPORT zsch_matt_exc.

DATA: gd_icon TYPE string VALUE 'ICON_GREEN_LIGHT',
      gd_result TYPE string.

START-OF-SELECTION.

  CALL FUNCTION 'ICON_CREATE'
    EXPORTING
      name                  = gd_icon
    IMPORTING
      result                = gd_result
    EXCEPTIONS
      icon_not_found        = 1
      outputfield_too_short = 2
      OTHERS                = 3.

  CASE sy-subrc.
    WHEN 0.
      WRITE: / 'Icon gefunden:', gd_result.
    WHEN 1.
      WRITE: / 'Icon nicht gefunden.'.
    WHEN 2.
      WRITE: / 'Output-Feld zu klein.'.
    WHEN OTHERS.
      WRITE: / 'Es ist eine unbekannte Ausnahme aufgetreten.'.
  ENDCASE.

Ausnahmeklassen in SAP

In SAP steht an oberster Stelle der Ausnahmeklassen die CX_ROOT. Diese hat drei Unterklassen.
Die im nachfolgenden Listing verwendete Ausnahmeklasse ZCX_MATT_TERMINTREUE ist eine Unterklasse von CX_STATIC-CHECK:

  1. CX_ROOT
    1. CX_NO_CHECK
    2. CX_DYNAMIC_CHECK
    3. CX_STATIC_CHECK
      1. ZCX_MATT_TERMINTREUE

TRY-CATCH-Ausnahmebehandlung mit Ausnahmeklasse

Die Klasse ZCX_MATT_TERMINTREUE wird mit Nachrichtenklasse erstellt, alle übrigen Einstellungen entsprechen den Vorgabewerten.

REPORT zsch_matt_exc_oo.

CLASS lcl_buch DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS check_in_time RAISING zcx_matt_termintreue.
  PROTECTED SECTION.
  PRIVATE SECTION.
    CLASS-DATA: gd_targetdate TYPE d VALUE '20171231'.
ENDCLASS.

CLASS lcl_buch IMPLEMENTATION.
  METHOD check_in_time.
    DATA: ls_textid LIKE if_t100_message=>t100key.

    IF sy-datum > gd_targetdate.
      ls_textid-msgid = 'ZSCH_MATT'.
      ls_textid-msgno = 001.

      RAISE EXCEPTION TYPE zcx_matt_termintreue
        EXPORTING
          textid = ls_textid.
    ENDIF.
  ENDMETHOD.
ENDCLASS.

DATA: gr_exc TYPE REF TO zcx_matt_termintreue,
      gd_text TYPE string.

START-OF-SELECTION.
  TRY .
      " Falls in der Methode keine Ausnahme auftritt, dann wird
      " der nachfolgende Programmcode bis zur letzten Zeile vor
      " dem CATCH ausgeführt. Der CATCH-Zweig wird übersprugen
      " und es wird nach dem ENDTRY weiter gemacht.
      CALL METHOD lcl_buch=>check_in_time.
      WRITE: / 'Der Autor ist mit seiner Arbeit im Plan.'.
    CATCH zcx_matt_termintreue INTO gr_exc.
      " Falls in der Methode eine Ausnahme auftritt, wird
      " diese im CATCH-Zweig behandelt, indem die die
      " Ausnahmeklasse verwendet wird.
      " Durch den Zusatz INTO kann mit der Ausnahmeklasse
      " kommuniziert werden, um z.B. den Text zu holen.
      gd_text = gr_exc->get_text( ).
      WRITE: / gd_text.
  ENDTRY.

EXCEPTIONS-Übungsbeispiel mit Internetzugriff und Interfaces

Programm zum Aufruf einer API per HTTP, die eine Antwort in Form von JSON liefert.

Dabei werden die Exceptions der einzelnen Schritte jeweils abgefangen.

REPORT zsch_matt_exc_getit.

* Verbindungsdaten
DATA: gr_client TYPE REF TO if_http_client, "Client für Anfrage
      gd_host TYPE string VALUE 'openlibrary.org', "Datenquelle
      gd_service TYPE string VALUE '80', "HTTPS-Port
      gd_path TYPE string VALUE '/api/books?bibkeys=ISBN:9781592293117&jscmd=data&format=json',
      gd_errortext TYPE string, "Fehlertext der Anfrage
      gd_timeout TYPE i, "Langläufer?
      gd_subrc LIKE sy-subrc. "Fehler bei Anfrage

* Datenausgabe
DATA: gd_data TYPE string, "Die Daten vom Response
      gt_fields TYPE tihttpnvp, "Felder aus dem Header
      gs_field LIKE LINE OF gt_fields,
      gt_data TYPE stringtab, "Zerhackte Ergebnisdaten
      gs_data LIKE LINE OF gt_data.

* Hauptprogramm
START-OF-SELECTION.

* Client-Objekt für die Kommunikation instanzieren
  CALL METHOD cl_http_client=>create
    EXPORTING
      host               = gd_host
      service            = gd_service
      scheme             = cl_http_client=>schemetype_http
    IMPORTING
      client             = gr_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4.
  IF sy-subrc <> 0.
    WRITE: / 'Initialisierung des Clients fehlgeschlagen, subrc = ',sy-subrc.
    EXIT.
  ENDIF.

* Request-Methode auf GET setzen
  CALL METHOD gr_client->request->set_method(
    if_http_request=>co_request_method_get ).

* Protokollversion HTTP/1.0 setzen
  gr_client->request->set_version(
    if_http_request=>co_protocol_version_1_0 ).

* Request-URI setzen
  cl_http_utility=>set_request_uri(
    request = gr_client->request
    uri = gd_path ).

* Senden des Requests
  CALL METHOD gr_client->send
    EXPORTING
      timeout                    = gd_timeout
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      OTHERS                     = 4.

* Fehlerbehandlung
  IF sy-subrc <> 0.
    CALL METHOD gr_client->get_last_error
      IMPORTING
        code    = gd_subrc
        message = gd_errortext.
    WRITE: / 'Kommunikationsfehler beim send',
           / 'Fehlercode: ', gd_subrc, 'Fehlernachricht: ', gd_errortext.
    EXIT.
  ENDIF.

* Empfangen der Ergebnisse
  CALL METHOD gr_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      OTHERS                     = 4.
  IF sy-subrc <> 0.
    CALL METHOD gr_client->get_last_error
      IMPORTING
        code    = gd_subrc
        message = gd_errortext.
    WRITE: / 'Kommunikationsfehler beim receive',
           / 'Fehlercode: ', gd_subrc, 'Fehlernachricht: ', gd_errortext.
    EXIT.
  ENDIF.

* Ausgabe der Daten
* Header-Daten der Übertragung
  CALL METHOD gr_client->response->get_header_fields
    CHANGING
      fields = gt_fields.

* Ausgabe der Header Fields auf Standardliste
  ULINE.
  WRITE: / 'Header Fields'.
  ULINE.
  LOOP AT gt_fields INTO gs_field.
    WRITE: / 'header_name', gs_field-name, 'header_value', gs_field-value.
  ENDLOOP.

* Response-Daten ermitteln aus Response-Objekt
  gd_data = gr_client->response->get_cdata( ).

  ULINE.
  WRITE: / 'Data'.
  ULINE.
  SPLIT gd_data AT '{' INTO TABLE gt_data.
  LOOP AT gt_data INTO gs_data.
    WRITE: / gs_data.
  ENDLOOP.

* Schließen der Verbindung
  CALL METHOD gr_client->close
    EXCEPTIONS
      http_invalid_state = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
    CALL METHOD gr_client->get_last_error
      IMPORTING
        code    = gd_subrc
        message = gd_errortext.
    WRITE: / 'Kommunikationsfehler beim close',
           / 'Fehlercode: ', gd_subrc, 'Fehlernachricht: ', gd_errortext.
    EXIT.
  ENDIF.