10.3 Ausnahmebehandlung
Die Ausnahmebehandlung in Flash gibt es leider erst seit Flash MX 2004. Dennoch ist Ausnahmebehandlung mit try-catch-Klauseln ein mächtiges Werkzeug für die Fehlerbehandlung zur Laufzeit, das bei größeren Projekten für den Flash Player 7 unbedingt eingesetzt werden sollte.
Möglicherweise sind Sie in einer Großküche beschäftigt und für die Zubereitung von Pfannkuchen zuständig. Normalerweise klappt dies immer, doch ab und an kann etwas schief gehen, was Sie dem Chefkoch möglichst mitteilen sollten:
function machePfannkuchen() {
if (keineZutaten) {
throw ("Zutaten für Pfannkuchen fehlen ...");
}
}
Und wenn es ein weitsichtiger Chefkoch ist, dann kann der darauf reagieren, ganz egal wann und von wo aus er den Pfannkuchen in Auftrag gegeben hat, denn Sie geben die ausnahmsweise auftretenden Probleme ja an die nächst höhere Instanz weiter:
try {
machePfannkuchen();
} catch (e) {
trace("Schließe Restaurante, denn "+e);
}
10.3.1 try-catch-finally
Der try-Block enthält die Anweisungen, die ausgeführt werden sollen und dabei eventuell zu einem Fehler führen könnten. Jedem try-Block muss dann mindestens noch ein weiterer Block folgen. Dabei steht der finally-Block für den Programmcode, der unabhängig von einem Fehler ausgeführt wird. Häufig wird dies für Aufräumaktionen eingesetzt, um z.B. Objekte oder Listener wieder zu entfernen:
try {
trace("tu was");
} finally {
trace("tu immer");
}
catch-Blöcke sind für die Fehlerbehandlung angedacht und erhalten den Fehler als Parameter:
try {
trace("tu was");
} catch (error) {
trace(error);
}
Jeder try-Block darf dabei mehrere catch-Blöcke besitzen, die abhängig vom Fehler abgearbeitet werden. Typisierung erlaubt es dabei, die Fehlerarten zu unterscheiden:
try {
trace("tu was");
} catch (error:ErrorA) {
trace(error);
} catch (error:ErrorB) {
trace(error);
}
Sollte übrigens kein catch-Block verfügbar sein, dann wird der Fehler im Ausgabefenster gezeigt.
Fehlertyp
Normalerweise werden Sie eigene Klassen für die verschiedenen Fehlerarten anlegen, um Fehler unterscheiden und darauf reagieren zu können. Eine fehlerhafte Benutzereingabe sollte beispielsweise zu einer anderen Meldung führen als eine fehlgeschlagene Internetkommunikation. Sollte es Ihnen ausreichen, nur Fehlerbezeichnungen und Fehlercodes zu unterscheiden, dann würde das so wie der folgende Code aussehen:
try {
throw "Fehler";
// throw 99;
} catch (error:String) {
trace("Fehlerbezeichnung");
} catch (error:Number) {
trace("Fehlercode");
}
10.3.2 throw
Da Flash leider keine Fehler zur Laufzeit erkennt, müssen wir als Entwickler selber dafür Sorge tragen. Dies geschieht mit Hilfe der throw-Anweisung. Diese erlaubt es, einen beliebigen Ausdruck als Fehler zu melden, der dann von dem nächsten verfügbaren catch-Block abgearbeitet wird:
try {
throw "Fehler";
} catch (error) {
trace(error);
}
Dabei können throw-Anweisungen völlig losgelöst von try-Blöcken verwendet werden. Sobald ein throw im Programmcode auftaucht, wird der Programmablauf unterbrochen und durch alle Funktionsaufrufe hindurch nach dem ersten passenden catch-Block gesucht. Jeder dabei gefundene finally-Block wird ebenfalls komplett abgearbeitet. Die folgende Funktion erkennt fehlerhafte Angaben und erzeugt eine Ausnahmebehandlung:
// Ermittle das Alter in Tagen
function getAgeInDays(date:Date):Number {
var minDate = new Date(1900);
var today = new Date();
if (date<minDate || date>today) {
throw "Ungültiger Geburtstag";
}
// getTime() ermittelt das Alter in Millisekunden
return (today-date)/(1000*60*60*24);
}
Der folgende try-Block ruft diese Funktion nun auf. Da innerhalb der Funktion kein catch-Block bereitsteht, kommt der folgende catch-Block zum Einsatz, sobald ein Fehler von der Funktion erzeugt wird:
try {
trace(getAgeInDays(new Date(1973, 0, 13)));
} catch (error) {
trace(error);
}
|