Anfang des Inhaltsbereichs

Ausnahmen definieren Dokument im Navigationsbaum lokalisieren

Ausnahmen werden durch Objekte repräsentiert, die Instanzen von Ausnahmeklassen sind. Die Definition einer Ausnahmen ist also gleichbedeutend mit dem Anlegen einer Ausnahmeklasse.

Alle Ausnahmeklassen müssen Erben der gemeinsamen Oberklasse CX_ROOT und einer ihrer Unterklassen:

sein. Die Zuordnung von Ausnahmeklassen zu einem dieser drei Pfade der Vererbungshierarchie bestimmt die Art, in der die zugehörigen Ausnahmen propagiert werden. Es gibt einen Satz vordefinierter Ausnahmeklassen CX_SY_..., deren Ausnahmen bei Fehlersituationen in der Laufzeitumgebung ausgelöst werden. Diese Klassen erben alle von CX_DYNAMIC_CHECK oder CX_NO_CHECK, aber nicht von CX_STATIC_CHECK (siehe Hierarchie in der ABAP-Schlüsselwortdokumentation).

Alle Ausnahmeklassen müssen mit dem Präfix CX_ beginnen. Sie werden in der Regel global mit dem Class Builder der ABAP Workbench definiert, es können aber auch lokale Ausnahmeklassen definiert werden.

Es können eigene (abstrakte) Ausnahmeklassen definiert werden, die als Oberklasse weiterer Ausnahmeklassen dienen. Über eine Oberklasse können die Ausnahmen der Unterklassen gemeinsam behandelt werden.

Ausnahmeklassen habe folgende Besonderheiten:

TEXTID vom Typ SOTR_CONC

Hiermit kann bestimmt werden, welchen ihrer Ausnahmetexte die Ausnahme verwenden soll.

PREVIOUS vom Typ CX_ROOT

Hiermit kann das Attribut PREVIOUS mit einer vorhergehenden Ausnahme belegt werden.

GET_TEXT

Gibt die Ausnahmetexte einer Klasse( gesteuert über das Attribut TEXTID) als String zurück.

GET_SOURCE_POSITION

Gibt den Programmnamen, den Namen eines eventuellen Include-Programms und die Zeilennummer der Auslösestelle zurück.

TEXTID

Dient dazu, die Ausnahme einer Klasse durch die Verwendung mehrerer Ausnahmetexte genauer zu spezifizieren. Wird in der Methode GET_TEXT ausgewertet.

PREVIOUS

Wird eine Ausnahme auf eine andere abgebildet, kann über den EXPORTING-Zusatz der Anweisung RAISE EXCEPTION über den gleichnamigen IMPORTING-PARAMETER des Konstruktors eine Referenz auf die ursprüngliche Ausnahme in diesem Attribut hinterlegt werden. Dabei kann eine Kette von Ausnahmeobjekten entstehen. Bei einem Laufzeitfehler werden die Ausnahmetexte aller Ausnahmen der Kette ausgegeben. Eine Abbildung einer Ausnahme auf eine andere ist z.B. dann sinnvoll, wenn der Kontext, in dem die ursprüngliche Ausnahme aufgetreten ist, entscheidend für die Charakterisierung der Fehlersituation ist.

KERNEL_ERRID

In diesem Attribut wird der Name des zugehörigen Laufzeitfehlers gespeichert, wenn die Ausnahme von der Laufzeitumgebung ausgelöst wurde, beispielsweise COMPUTE_INT_ZERODIVIDE bei einer Division durch Null. Falls die Ausnahme nicht behandelt wird, kommt es zu genau diesem Laufzeitfehler.

Für dieses Attribut kann kein Parameter an den Konstruktor übergeben werden. Falls die Ausnahme mit RAISE EXCEPTION ausgelöst wird, wird das Attribut auf initial gesetzt.

Globale Ausnahmeklassen

Globale Ausnahmeklassen werden im Class Builder definiert und verwaltet. Wenn beim Anlegen einer neuen Klasse die richtige Namenskonvention (Präfix CX_) und der Klassentyp Ausnahmeklasse gewählt wird, wird der Class Builder automatisch zum Exception Builder.

Der Exception Builder bietet genau die nötige Funktionalität um Ausnahmeklassen zu definieren und generiert selbständig festgelegte Komponenten, die nicht geändert werden dürfen. Beim Anlegen muß angegeben werden, von welcher Kategorie die Ausnahme sein soll, also ob von CX_STATIC_CHECK, CX_DYNAMIC_CHECK oder CX_NOCHECK geerbt werden soll.

Registerkarten des Exception Builder

Der Exception Builder hat die Registerkarten Eigenschaften, Attribute, Methoden und Texte.

Lokale Ausnahmeklassen

Für spezielle Ausnahmen, die nur innerhalb eines einzigen ABAP-Programms auftreten, können lokale Ausnahmeklassen definiert werden. Die Bedingung an eine lokale Ausnahmeklasse ist, daß sie von einer der drei Klassen CX_STATIC_CHECK, CX_DYNAMIC_CHECK oder CX_NO_CHECK oder deren Unterklassen erbt. Es können ein eigener Konstruktor und eigene Attribute angelegt werden. Es sollen aber keine eigenen Methoden angelegt oder die Methoden von Oberklassen redefiniert werden.

Beispiele zu lokalen Ausnahmeklassen

Beispiel

report DEMO_LOCAL_EXCEPTION_1.

class CX_LOCAL_EXCEPTION definition
                        inheriting from CX_STATIC_CHECK.
endclass.

start-of-selection.
  try.
      raise exception type CX_LOCAL_EXCEPTION.
    catch CX_LOCAL_EXCEPTION.
      message 'Local Exception!' type 'I'.
  endtry.

Dieses Beispiel zeigt eine minimale lokale Ausnahmeklasse. Sie ist nichts anderes als die lokale Repräsentation einer der drei direkten Unterklassen von CX_ROOT und kann im Programm verwendet werden.

Beispiel

report DEMO_LOCAL_EXCEPTION_2.

class CX_LOCAL_EXCEPTION definition
                        inheriting from CX_STATIC_CHECK.
  public section.
    data LOCAL_TEXT type STRING.
    methods CONSTRUCTOR importing TEXT type STRING.
endclass.

class CX_LOCAL_EXCEPTION implementation.
  method CONSTRUCTOR.
    SUPER->CONSTRUCTOR( ).
    LOCAL_TEXT = TEXT.
  endmethod.
endclass.

data OREF type ref to CX_LOCAL_EXCEPTION.

start-of-selection.
  try.
      raise exception type CX_LOCAL_EXCEPTION
                      exporting TEXT = `Local Exception`.
    catch CX_LOCAL_EXCEPTION into OREF.
      message OREF->LOCAL_TEXT type 'I'.
  endtry.

In diesem Beispiel wird die Ausnahmeklasse des vorherigen Beispiels um ein eigenes Attribut und einen eigenen Konstruktor erweitert. Der IMPORTING-Parameter des Konstruktors muß beim Auslösen der Ausnahme versorgt werden, da er hier nicht optional ist. Im Behandler der Ausnahme kann das Attribut ausgewertet werden.

Beispiel

report DEMO_LOCAL_EXCEPTION_3.

class CX_LOCAL_EXCEPTION definition
      inheriting from CX_SY_ARITHMETIC_ERROR.
  public section.
    methods CONSTRUCTOR importing SITUATION type STRING.
endclass.

class CX_LOCAL_EXCEPTION implementation.
  method CONSTRUCTOR.
    SUPER->CONSTRUCTOR( OPERATION = SITUATION ).
  endmethod.
endclass.

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

start-of-selection.
  try.
      raise exception type CX_LOCAL_EXCEPTION
            exporting SITUATION = `START-OF-SELECTION`.
    catch CX_LOCAL_EXCEPTION into OREF.
      TEXT = OREF->GET_TEXT( ).
      message TEXT type 'I'.
  endtry.

In diesem Beispiel wird eine Ausnahmeklasse von einer der vordefinierten Ausnahmeklassen für Fehlersituationen in der Laufzeitumgebung abgeleitet. Es wird ein eigener Konstruktor mit eigenem IMPORTING-Parameter definiert, der den Oberklassenkonstruktor mit diesem Parameter versorgt. Bei der Behandlung der Ausnahme wird der Ausnahmetext, wie er in der Oberklasse definiert ist, mit GET_TEXT ausgelesen.

Ende des Inhaltsbereichs