Laufzeitfehler abfangen 

Während manche Laufzeitfehler auf Zustände zurückzuführen sind, die eine Fortführung des ABAP-Programms keinesfalls erlauben, gibt es auch Laufzeitfehler, die im Programm behandelt werden können. Deshalb sind die Laufzeitfehler in abfangbar und nicht abfangbar unterteilt. Zu jeder ABAP-Anweisung ist in der Schlüsselwortdokumentation angegeben, zu welchen Laufzeitfehlern die Anweisung eventuell führen kann und ob diese abfangbar sind oder nicht. Abfangbare Laufzeitfehler sind in sogenannte ERROR-Klassen zusammengefaßt, die es erlauben ähnliche Fehler gemeinsam zu behandeln.

Abfangbare Laufzeitfehler können mit folgenden Kontroll-Anweisungen im ABAP-Programm behandelt werden:

CATCH SYSTEM-EXCEPTIONS <exc1> = <rc 1> ... <exc n> = <rc n>.
  ...
ENDCATCH.

Die Ausdrücke <exci> bezeichnen entweder einen abfangbaren Laufzeitfehler oder den Namen einer ERROR-Klasse. Die Ausdrücke <rc i> sind Zahlenliterale. Wenn in dem Anweisungsblock zwischen CATCH und ENDCATCH einer der angegebenen Laufzeitfehler auftritt, wird das Programm nicht abgebrochen, sondern direkt zu ENDCATCH gesprungen. Nach ENDCATCH steht der dem Laufzeitfehler zugeordnete Zahlenwert <rc i> im Feld SY-SUBRC als Rückgabewert zur Verfügung. Der Inhalt der bei einer fehlerhaften Anweisung beteiligten Felder ist nach ENDCATCH nicht garantiert.

CATCH-Kontrollstrukturen werden wie IF-Kontrollstrukturen behandelt. D.h. sie sind beliebig tief schachtelbar, können aber nur innerhalb eines Verarbeitungsblocks angelegt werden. Weiterhin fangen CATCH-Kontrollstrukturen nur die Laufzeitfehler der aktuellen Aufrufebene ab und nicht die aufgerufener Prozeduren.

In der Schlüsselwortdokumentation zu CATCH findet man eine Liste aller abfangbaren Laufzeitfehler und ihre Organisation in ERROR-Klassen.

 

REPORT demo_catch_endcatch.

DATA: result TYPE p DECIMALS 3,
      number TYPE i VALUE 11.

CATCH SYSTEM-EXCEPTIONS arithmetic_errors = 5.
  DO.
    number = number - 1.
    result = 1 / number.
    WRITE: / number, result.
  ENDDO.
ENDCATCH.

SKIP.

IF sy-subrc = 5.
  WRITE / 'Division by zero!'.
ENDIF.

Das Programm berechnet zehnmal den Quotienten aus 1 und NUMBER bis der abfangbare Laufzeitfehler BCD_ZERODIVIDE auftritt. Dieser Laufzeitfehler gehört zur ERROR-Klasse ARITHMETIC_ERRORS und wird über diese abgefangen.