Anfang des InhaltsbereichsAusnahmetexte Dokument im Navigationsbaum lokalisieren

Die wichtigste Eigenschaft einer abgefangenen Ausnahme ist, daß sie überhaupt aufgetreten ist und im Programm behandelt wird. Der Behandler muß sich darum kümmern, wie er mit der Ausnahmesituation verfährt. Es ist nicht Sache der Ausnahme selbst, mit dem Programmbenutzer in Interaktion zu treten.

Trotzdem ist jeder Ausnahme ein erläuternder Text zugeordnet, der die Ausnahmesituation näher beschreibt. Dieser Text wird als Fehlermeldung ausgegeben, wenn die Ausnahme nicht behandelt wird. Er sollte aber nur in begrenztem Maß während der Ausnahmebehandlung zur Kommunikation mit dem Benutzer eingesetzt werden. Der Ausnahmetext beschreibt eine Fehlersituation aus einer meist technischen Sicht. Dem Benutzer sollte eine Ausnahme, wenn überhaupt, aus seiner Sicht beschrieben werden.

Attribute als Parameter in Ausnahmetexten

Ausnahmetexte können Parameter enthalten, um eine Fehlersituation näher beschreiben zu können. Hierzu dienen elementare Attribute der Ausnahmeklasse, deren Inhalt als Text interpretierbar ist. Attribute werden zu Parametern von Ausnahmetexten, indem man ihren Namen durch die Zeichen '&' eingeschlossen im Ausnahmetext aufführt. Falls ein Zeichen '&' selbst im Text auftauchen soll, muß es doppelt angegeben werden.

Beispiel

Falls ein Ausnahmeobjekt die Attribute ANWALT und PARTNER mit den Inhalten 'Müller' und 'Meier' hat, wird folgender parametrisierter Ausnahmetext der Klasse:

Kanzlei &anwalt&&&&partner&

in diesem Objektzustand zu:

Kanzlei Müller&Meier

Regeln

Die Regeln für das Parametrisieren von Ausnahmetexten durch Attribute sind:

  1. Wenn in der Meldung Textparameter auftauchen, die in der Klasse nicht als Attribute vorkommen, bleiben die Namen der Parameter unverändert im Text stehen.
  2. Wenn in der Meldung ein Textparameter auftaucht, der im Objekt zwar als Attribut vorkommt, aber nicht als Text interpretierbar ist, bleibt der Namen des Parameter unverändert im Text stehen und es wird zusätzlich der Typ des Attributs angegeben.
  3. Überschreitet der Inhalt eines zu substituierenden Attributs eine sinnvolle Länge, so kann dieser abgeschnitten werden, wobei das Abschneiden durch '...' kenntlich gemacht wird.

Ausnahmetexte verwalten

Die Ausnahmetexte globaler Ausnahmeklassen werden mit ihren verschiedenen Übersetzungen im OTR (Open Text Repository) abgelegt. Die Zuordnung eines Texts zu einer Ausnahmeklasse erfolgt über das in der Oberklasse CX_ROOT definierte Attribut TEXTID, das in einem Ausnahmeobjekt zur Laufzeit die global Eindeutige Kennung des Textobjekts im OTR enthält. Die Methode GET_TEXT liest diesen Text aus, substituiert eventuelle Textparameter mit dem Inhalt der entsprechenden Attribute und gibt ihn als String zurück.

Ausnahmetexte liegen im OTR in beliebiger Sprache vor. Sobald jedoch GET_TEXT aufgerufen wird, erfolgt unweigerlich die Festlegung auf die jeweilige Anmeldesprache. Es ist daher immer sinnvoller, innerhalb einer Anwendung mit dem Ausnahmeobjekt selbst zu arbeiten, also es weiterzugeben oder aufzubewahren, und nicht mit dem von GET_TEXT zurückgelieferten Wert.

Ausnahmetexte anlegen

Die Ausnahmetexte globaler Klassen werden auf der Registerkarte Texte des Exception Builders definiert. Der Exception Builder erzeugt die entsprechenden Einträge im OTR.

Einer Klasse können mehrere Texte zugeordnet werden, die jeweils über eigene Kennungen angesprochen werden. Der Exception Builder generiert für jede globale Klasse einen Standardtext, dessen nicht-änderbarer Name dem Klassennamen entspricht. Für weitere Texte müssen eigene Namen vergeben werden. Für jeden Text erzeugt der Exception Builder eine statische Konstante, die die zugehörige Kennung im OTR enthält. Deshalb liegen die Namen von Ausnahmetexten im gleichen Namensraum wie die Attribute der Ausnahmeklasse und sind für einen Pfad der Vererbungshierarchie eindeutig. Über die statische Konstante ist ein Text ansprechbar und identifizierbar, so daß im ABAP-Programm nicht direkt mit dem OTR gearbeitet werden muß.

Beispiel für Ausnahmetexte im Exception Builder

Die vordefinierte Ausnahmeklasse CX_SY_FILE_OPEN_MODE wird von der Laufzeitumgebung verwendet, um auf Ausnahmen beim Dateizugriff hinzuweisen, bei denen die Datei nicht oder nicht im korrekten Modus geöffnet wurde. Außer dem Standardtext enthält die Klasse drei weitere Texte, READ_ONLY, NOT_OPEN und INCOMPATIBLE_MODE, die es erlauben, die Ausnahme spezifischer zu behandeln, ohne gleich weitere Unterklassen anlegen zu müssen.

Ausnahmetexte und Konstruktor

Durch die Übergabe der oben erwähnten statischen Konstanten an den IMPORTING-Parameter TEXTID des Instanzkonstruktors kann beim Auslösen einer Ausnahme der zu verwendende Ausnahmetext festgelegt werden. Ohne Angabe wird der Standardtext verwendet. Der Instanzkonstruktor muß entsprechend programmiert werden. Bei globalen Ausnahmeklassen generiert der Exception Builder ihn sogar so, daß für jede Ausnahme mindestens ein Text zur Verfügung steht. Selbst wenn kein Standardtext eingegeben wird, wird der Text der nächstmöglichen Oberklasse verwendet.

Der Exception Builder sorgt auch dafür, daß der Instanzkonstruktor gleichnamige IMPORTING-Parameter für die Attribute hat, mit denen die Parameter der Ausnahmetexte gefüllt werden.

Bei lokalen Klassen muß man sich selbst um diese Dinge kümmern.

Ausnahmetexte ausgeben

Obwohl die Ausnahmetexte primär nicht dazu gedacht sind, in Interaktion mit dem Endbenutzer zu treten, kann es in einigen Fällen sinnvoll sein, sie als Nachrichten auszugeben. Hierzu wurde die MESSAGE-Anweisung so erweitert, daß beliebige Strings ausgegeben werden können.:

MESSAGE string TYPE type.

Neben der auszugebenden Meldung string muß der gewünschte Typ in einem Feld type angegeben werden.

Beispiel

Beispiel

report DEMO_EXCEPTION_TEXT.

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

try.
    raise exception type CX_SY_FILE_OPEN_MODE
          exporting TEXTID = CX_SY_FILE_OPEN_MODE=>READ_ONLY
                    FILENAME = `DUMMY.DAT`.
  catch CX_SY_FILE_OPEN_MODE into OREF.
    TEXT = OREF->GET_TEXT( ).
    message TEXT type 'I'.
endtry.

try.
    raise exception type CX_SY_FILE_OPEN_MODE
          exporting TEXTID = CX_SY_FILE_OPEN_MODE=>NOT_OPEN
                    FILENAME = `DUMMY.DAT`.
  catch CX_SY_FILE_OPEN_MODE into OREF.
    TEXT = OREF->GET_TEXT( ).
    message TEXT type 'I'.
endtry.

try.
    raise exception type CX_SY_FILE_OPEN_MODE
    exporting TEXTID = CX_SY_FILE_OPEN_MODE=>INCOMPATIBLE_MODE
                    FILENAME = `DUMMY.DAT`.
  catch CX_SY_FILE_OPEN_MODE into OREF.
    TEXT = OREF->GET_TEXT( ).
    message TEXT type 'I'.
endtry.

In diesem Beispiel wird die vordefinierte Ausnahme CX_SY_FILE_OPEN_MODE dreimal ausgelöst und abgefangen. Durch verschiedene Parameterübergaben an den Instanzkonstruktor werden nacheinander die drei Ausnahmetexte der Klasse verwendet und auch deren Parameter FILENAME versorgt.

Ende des Inhaltsbereichs