Übung Schrödinger: 11 Ausnahmen (ABAP)
Aus MattWiki
Nachfolgend finden sich drei Listings aus den Übungsaufgaben zum Thema Ausnahmen aus Kapitel 11 des Buchs "Schrödinger programmiert ABAP".
Arten von Ausnahmen
Ausnahmen können auf drei wegen erzeugt werden:
- EXCEPTIONS-Parameter abgefangen mit SY-SUBRC
- CATCH SYSTEM-EXCEPTIONS (Obsolet)
- Ausnahmeklasse
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
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.