
Zuvor haben wir uns in diesem Kurs mit der Fehlerbehandlung mit den TRY-, CATCH- und ENDTRY-Anweisungen befasst. Nach der TRY-Anweisung kommt die Anweisung, die zu einem Fehler führen kann. Wenn der Fehler auftritt, springt das System zur CATCH-Anweisung und verarbeitet deren Inhalt. Unabhängig davon, was passiert, führt die Methode die Verarbeitung nach der ENDTRY-Anweisung durch.

In einem TRY…ENDTRY -Block können Sie mehrere CATCH-Anweisungen einbinden. Auf diese Weise können Sie verschiedene Ausnahmen unterschiedlich behandeln.

Sie können mehrere Ausnahmen in einer einzelnen CATCH-Anweisung auflisten. In diesem Beispiel wird derselbe CATCH-Block verarbeitet, wenn das System entweder cx_sy_arithmetic_error oder cx_sy_zerodivide auslöst.

Wenn Sie eine Klasse in einer CATCH-Anweisung auflisten, verarbeitet das System den entsprechenden Block, wenn eine Ausnahme mit dieser Klasse oder einer ihrer Unterklassen ausgelöst wird. In diesem Beispiel ist cx_sy_arithmetic_error eine Oberklasse von cx_sy_arithmetic_overflow und cx_sy_zerodivide. Gleichzeitig wird der Block verarbeitet, wenn eine Ausnahme vom Typ einer der Unterklassen ausgelöst wird.

Alle Ausnahmeklassen sind Teil einer Vererbungshierarchie, deren oberste Oberklasse die Klasse cx_root ist. Wie wir bereits gesehen haben, springt das System, wenn Sie eine Oberklasse in einer CATCH-Anweisung verwenden, dorthin, wenn eine Ausnahme mit dem Typ einer ihrer Unterklassen ausgelöst wird. Da alle Ausnahmeklassen Unterklassen von cx_root sind, reicht die Anweisung CATCH cx_root aus, um eine Ausnahme abzufangen.
Reihenfolge der CATCH-Anweisungen

Wenn Sie CATCH-Anweisungen schreiben, müssen Sie die spezifischste Klasse (oder die spezifischsten Klassen) an erster Stelle und die allgemeinste an letzter Stelle setzen. Wenn Sie eine Oberklasse über einer ihrer Unterklassen platzieren, verursachen Sie einen Syntaxfehler. Dies liegt daran, dass das System den spezifischen CATCH-Block nicht verarbeiten konnte, da er von dem generischeren Block überschattet wird.
Der INTO -Zusatz
Jede Ausnahme wird durch ein Objekt repräsentiert. Sie können dieses Objekt in eine Referenzvariable stellen und damit arbeiten, z.B. um den Fehlertext aus der Ausnahmeklasse mit der Methode get_text( ) abzurufen, wie im Beispiel hier gezeigt.

Sie können eine Inline-Deklaration in der CATCH -Anweisung verwenden, um sicherzustellen, dass die Referenzvariable mit dem richtigen Typ deklariert wird.
Am häufigsten wird mit dem Ausnahmeobjekt gearbeitet, indem seine Methode get_text( ) aufgerufen wird. Ausnahmeobjekte können jedoch über andere Attribute und Methoden verfügen, um Sie bei der Fehlerbehebung zu unterstützen.

Ausnahmeklassen können Attribute haben, die genauer beschreiben, was schiefgelaufen ist. Diese Attribute werden häufig verwendet, um die Platzhalter von Nachrichten zu füllen. Sie definieren ein Attribut im öffentlichen Bereich der Ausnahmeklasse mit seinem entsprechenden Namen und Typ.
Um ein Attribut beim Auslösen der Ausnahme zu füllen, benötigen Sie einen entsprechenden Importparameter des Konstruktors der Ausnahmeklasse. Sie können diesen Importparameter mit einem Quickfix generieren. Positionieren Sie den Cursor auf dem Methodennamen constructor, und drücken Sie Strg + 1. Wählen Sie das Quickfix Konstruktor neu generieren.
Ausnahmen propagieren

Eine Methode kann eine Ausnahme entlang der Aufrufkette propagieren. Statt die Ausnahme mit der CATCH-Anweisung zu behandeln, nimmt die Methode die RAISING-Klausel in ihre Definition auf. Dies zeigt den Aufrufern der Methode an, dass ihnen die Ausnahme übergeben werden kann.
Wenn die Ausnahme entlang der Aufrufkette nirgends abgefangen wird, tritt ein Laufzeitfehler auf.
Das Attribut previous
Manchmal fängt eine Methode innerhalb einer Aufrufkette eine Ausnahme ab und löst als Antwort eine andere Ausnahme aus, damit der eigene Aufrufer sie abfangen kann. Dies kann z.B. der Fall sein, wenn ein Framework eine Ausnahme auslöst, die zu technisch orientiert ist, damit die Anwendung verarbeitet werden kann. Die Methode, die eine eigene Ausnahme auslöst, übergibt möglicherweise die erste Ausnahme. Dies kann über das Attribut previous der Ausnahmeklasse erfolgen.

Wenn Sie eine Ausnahme auslösen, können Sie eine Instanz einer Ausnahmeklasse an den Importparameter previous übergeben. Dadurch wird das Ausnahmeobjekt an die neue Ausnahme angehängt. Eine Methode, die die zweite Ausnahme abfängt, kann über das öffentliche schreibgeschützte Attribut previous auf das erste Ausnahmeobjekt zugreifen.
Da previous in der Oberklasse cx_root implementiert ist, steht sie in allen Ausnahmeklassen zur Verfügung.