Ü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 abfangen mit SY-SUBRC
- CATCH SYSTEM-EXCEPTIONS (Obsolet)
- TRY-CATCH-Ausnahmebehandlung mit 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.
TRY-CATCH-Ausnahmebehandlung mit Ausnahmeklasse
Es stehen folgende Klassen ganz Oben in der Hierarchie zur Verfügung. Darin wird die in diesem Listing verwendete Ausnahmeklasse ZCX_MATT_TERMINTREUE unterhalb von CX_STATIC-CHECK erstellt:
- CX_ROOT
- CX_NO_CHECK
- CX_DYNAMIC_CHECK
- CX_STATIC_CHECK
- ZCX_MATT_TERMINTREUE
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.