Anfang des InhaltsbereichsAusnahmen auslösen Dokument im Navigationsbaum lokalisieren

Es gibt zwei prinzipielle Möglichkeiten zum Auslösen von klassenbasierten Ausnahmen.

  1. systemgesteuertes Auslösen in der Laufzeitumgebung
  2. programmgesteuertes Auslösen im ABAP-Programm

Ausnahmen der Laufzeitumgebung

Bei Fehlersituationen während der Ausführung von ABAP-Anweisungen in der ABAP-Laufzeitumgebung, löst diese je nach Fehler entweder behandelbare oder unbehandelbare Ausnahmen aus. Die behandelbaren Ausnahmen sind klassenbasiert und können zwischen TRY und ENDTRY behandelt werden. Die zugehörigen Ausnahmeklassen sind im System vordefiniert und beginnen mit dem Präfix CX_SY_, wie z.B. CX_SY_ZERODIVIDE. In der ABAP-Schlüsselwortdokumentation sind bei jedem Schlüsselwort die Ausnahmeklassen aufgeführt, deren Ausnahmen bei Ausführung einer entsprechenden ABAP-Anweisung auftreten können. Ein typisches Beispiel ist obige Klasse CX_SY_ZERODIVIDE, die bei der Berechnung eines arithmetischen Ausdrucks in der Anweisung COMPUTE auftreten kann. Jeder vordefinierten Ausnahmeklasse sind je nach Ursache des Fehlers ein oder mehrere Laufzeitfehler zugeordnet. Die Laufzeitfehler treten nur auf, wenn die Ausnahme nicht abgefangen wird.

Ausnahmen im ABAP-Programm

Bei Fehlersituationen im ABAP-Programm können mit der Anweisung RAISE EXCEPTION programmgesteuert Ausnahmen ausgelöst werden. Dabei sind Ausnahmen möglich, die sowohl auf selbstdefinierten als auch auf den im System vordefinierten Ausnahmeklassen beruhen.

Die Anweisung RAISE EXCEPTION hat zwei Varianten:

Auslösen einer Ausnahme unter Erzeugen des Ausnahmeobjekts

Die Syntax hierfür ist:

RAISE EXCEPTION TYPE cx_... [EXPORTING ... fi = ai ...].

Diese Anweisung löst die mit der Ausnahmeklasse cx_... verknüpfte Ausnahme aus und erzeugt ein zugehöriges Ausnahmeobjekt. Mit dem EXPORTING-Zusatz können die optionalen IMPORTING-Parameter des Instanzkonstruktors der Ausnahmeklasse versorgt. Dieser kann die Attribute des Objekts mit Werten belegen, auf die ein Behandler Zugriff hat.

Aus Effizienzgründen wird nur dann tatsächlich ein Ausnahmeobjekt erzeugt, wenn bei der Ausnahmebehandlung der INTO-Zusatz der Anweisung CATCH verwendet wird. Aus diesem Grund sollte der Konstruktor bis auf das Initialisieren der Attribute keine weitere Funktionalität enthalten und kann in globalen Ausnahmeklassen auch nicht geändert werden (Nur der Konstruktor einer lokalen Ausnahmeklasse kann weitere Funktionalität enthalten).

Auslösen einer Ausnahme mit einem bestehenden Ausnahmeobjekt

Die Syntax hierfür ist:

RAISE EXCEPTION ref.

In diesem Fall muß das Ausnahmeobjekt bereits vorhanden sein und die Referenzvariable REF darauf zeigen. Das kann der Fall sein, wenn die Ausnahme schon einmal abgefangen wurde, der Behandler sie aber nochmals auslösen will (beispielsweise weil er sie nicht vollständig behandeln kann) oder wenn das Ausnahmeobjekt vorher durch CREATE OBJECT erzeugt wurde.

Beispiel

Beispiel

report  DEMO_RAISE_EXCEPTIONS.

data OREF type ref to CX_ROOT.
data TEXT type STRING.

try.
  try.
    raise exception type CX_DEMO_CONSTRUCTOR
          exporting MY_TEXT = SY-REPID.
    catch CX_DEMO_CONSTRUCTOR into OREF.
      TEXT = OREF->GET_TEXT( ).
      write / TEXT.
      raise exception OREF.
  endtry.
  catch CX_DEMO_CONSTRUCTOR into OREF.
    TEXT = OREF->GET_TEXT( ).
    write / TEXT.
endtry.

Dieses Beispiel zeigt die zwei Varianten der Anweisung RAISE EXCEPTION. Die erste Anweisung löst im inneren TRY-Block die selbstdefinierte Ausnahme der Klasse CX_DEMO_CONSTRUCTOR, erzeugt das betreffende Objekt und übergibt den Programmnamen an den Instanzonstruktor. Im inneren CATCH-Block wird die Ausnahme behandelt, der Ausnahmetext ausgegeben und die Ausnahme ohne Erzeugung eines neuen Objekts nochmals ausgelöst. Der äußere CATCH-Block behandelt die Ausnahme nochmals. Die Klasse CX_DEMO_CONSTRUCTOR ist so definiert, daß der übergebene Programmname im Ausnahmetext auftaucht. Dafür sorgt der generierte Instanzkonstruktor.

Ende des Inhaltsbereichs