Show TOC

AusnahmebehandlungenLocate this document in the navigation structure

Ausnahmen treten bei Fehlersituationen auf. Sie werden entweder von der Laufzeitumgebung oder programmatisch mit der Anweisung RAISE EXCEPTION ausgelöst. Ausnahmen werden durch Instanzen von Ausnahmeklassen repräsentiert und können entweder im aktuellen Kontext behandelt oder mit dem Zusatz RAISING in der Schnittstelle von Prozeduren an einen Aufrufer weitergereicht werden. Ausnahmen werden in einer TRY-CATCH-ENDTRY-Kontrollstruktur behandelt. Nicht behandelte Ausnahmen führen zu Laufzeitfehlern (protokollierte Programmabbrüche).

Beispiel

Behandlung eines arithmetischen Fehlers. Bei einer Division durch Null wird die Ausnahme cx_sy_zerodivide ausgelöst, über ihre Oberklasse cx_sy_arithmetic_error abgefangen und der Anweisungsblock statement_block ausgeführt.

               TRY.
    result = 1 / number.
  CATCH cx_sy_arithmetic_error.
    statement_block
ENDTRY.
            

Durch Angabe von Ausnahmen mittels Zusatz RAISING werden diese zum Bestandteil der Schnittstelle einer Prozedur. Dadurch kann schon zur Übersetzungszeit vom Compiler überprüft werden, ob alle innerhalb der Prozedur mit der Anweisung RAISE EXCEPTION ausgelösten, oder in der Schnittstelle aufgerufener Prozeduren enthaltenen Ausnahmen auch in der Prozedur selbst mittels CATCH behandelt, oder in der Prozedurschnittstelle deklariert werden. In bestimmten Fällen ist eine solche strenge Prüfung jedoch nicht erwünscht, zum Beispiel bei Ausnahmen aufgrund von Ressourcen-Engpässen (die sich lokal nur schwer behandeln lassen) oder bei Ausnahmen von denen der Entwickler weiß, daß sie nicht auftreten werden. Aus diesem Grund erben Ausnahmeklassen nicht direkt von der Ausnahme-Wurzelklasse cx_root, sondern von einer der drei abgeleiteten Klassen cx_static_check, cx_dynamic_check oder cx_no_check. Nur im ersten Fall erfolgt die oben genannte statische Prüfung durch den Compiler. Im zweiten Fall wird die Deklaration einer Ausnahme zur Laufzeit geprüft, und zwar beim Versuch, die Ausnahme an den Aufrufer zu propagieren. Wird hierbei festgestellt, daß die Ausnahme nicht in der Schnittstelle deklariert ist, wird die Ausnahme cx_sy_no_handler ausgelöst. Im letzteren Fall erfolgt weder zur Übersetzungszeit noch zur Laufzeit eine solche Prüfung. Ausnahmen können bis hin zur Ebene der Ereignisblöcke oder Dialogmodule propagiert werden.Werden sie hier nicht spätestens behandelt, wird ein Laufzeitfehler ausgelöst.