9. Ausnahmen und Ausnahmebehandlung | ||||||
|
||||||
9.3 Vordefinierte Ausnahmen
In Ada existieren folgende vordefinierte Ausnahmen: Constraint_Error - wird ausgelöst, wenn Bereichseinschränkungen, Indexeinschränkungen oder Diskriminaten-einschränkungen verletzt werden. Numeric_Error - ist aus Kompatibilitätsgründen zu Ada 83 noch im Sprachumfang enthalten, wird aber nicht mehr ausgelöst. Statt Numeric_Error wird jetzt Constraint_Error ausgelöst. Storage_Error - wird ausgelöst, wenn mehr Speicher von einem Prozeß angefordert wird, als zur Verfügung steht. Program_Error - wird bei verschiedenen Programmfehlern ausgelöst, z. B. wenn Daten oder Unterprogramme aus anderen, noch nicht elaborierten Paketen genutzt werden. Tasking_Error - wird ausgelöst, wenn bei der Kommunikation über Rendezvous zwischen Prozessen Ausnahmen auftreten. Das Auslösen dieser Ausnahmen erfolgt automatisch bei Fehlern während der Programmausführung. Selbstdefinierte Ausnahmen Neben diesen vordefinierten Ausnahmen erlaubt Ada auch die Deklaration von selbst-definierten Ausnahmen. Solch eine Ausnahme kann natürlich nicht vom Laufzeitsystem entdeckt werden, sondern wird durch eine "raise" -Anweisung explizit ausgelöst. Alle selbstdefinierten Ausnahmen sind vom Typ "Exception" und haben die Form Fehlerbezeichnung1, Fehlerbezeichnung2, ... : Exception; Beispiel:
Die Deklaration von Ausnahmen kann an jeder beliebigen Stelle im Deklarationsteil erscheinen. Typischerweise werden Ausnahmen jedoch in einer Paketspezifikation deklariert, damit sie programmweit benutzt werden können. Ausnahmedeklarationen sind auch im Deklarationsteil von Unterprogrammrümpfen (subprogram_body <BNF>), Paketrümpfen (package_body <BNF>) und Blockanweisungen (block_statement <BNF>) erlaubt. Im folgenden Beispiel löst die Eingabe einer negativen Zahl eine vordefinierte Ausnahme aus. Die Ausnahme wird im Ausnahmebehandler der Funktion behandelt und als selbstdefinierte Ausnahme an die nächste Ebene weitergereicht.
Eine "raise"-Anweisung kann überall im Anweisungsteil verwendet werden und bewirkt die sofortige Auslösung der entsprechenden Ausnahme. Die ihr folgenden Anweisungen werden nicht mehr ausgeführt. Die "raise"-Anweisung hat die Form raise [Fehlerbezeichnung]; Sie kann sowohl für benutzerdefinierte als auch für vordefinierte Ausnahmen verwendet werden. Beispiel :
Soll eine Ausnahme als Indiz für einen fatalen Fehler gelten, so kann sie benutzt werden, um das Programm zu veranlassen, sich geordnet zu beenden (d. h. Retten von Daten, Speichern von Fehlerinformationen, Schalten von Fehlerlampen usw.). Ein Ausnahmebehandler, der diese Funktionalität über alle Ebenen der Softwarestruktur weiterleitet, könnte folgenden Aufbau haben:
Angenommen, dieser Ausnahmebehandler wird in einem Unterprogramm verwendet, so wird bei Auslösen dieser Ausnahme eine Prozedur System_Herunterfahren aufgerufen, die ein geordnetes Beenden des Unterprogrammes ermöglicht. Der Effekt der dann folgenden "raise"-Anweisung ist, daß die Ausnahme an die nächste Ebene weitergereicht wird. So kann über verschiedene Ebenen ein Fehler sukzessive bearbeitet werden. Die Anweisung "raise" kann innerhalb eines Ausnahmebehandlers auch ohne einen Ausnahmenamen aufgerufen werden. Dieses bewirkt das erneute Aufrufen der Ausnahme. Der folgende Ausnahmebehandler hat somit die gleiche Wirkung wie der vorherige:
|
||||||
|