Peter Fischer
Das Thema Fehler sollte ein rotes Tuch für alle AppleScripter sein - oder etwa doch nicht? Niemand mag es, wenn im Skript Fehler auftreten. Passiert dies doch, wäre es zumindest gut, wenn man die Fehlermeldung einigermaßen interpretieren könnte. Manchmal kann ein Fehler aber auch nützlich sein - wir werden das später noch sehen.
Deshalb basteln wir uns hier eine Fehlerliste - und das machen wir natürlich per AppleScript.
Damit wir nicht warten müssen, bis alle möglichen Fehler einmal aufgetreten sind, veranlassen wir unser Skript dazu, diese Fehler hervor zu rufen. Wie geht das?
Um einen Fehler zu produzieren, schreiben wir das Wort error.
Der Dialog im folgenden Skript wird nicht erscheinen:
error display dialog "Das Skript läuft weiter."
Die Fehlermeldung lautet: Es ist ein Fehler aufgetreten.
Dies ist natürlich nicht sehr aussagekräftig. Wir haben jedoch die Möglichkeit, den Text der Fehlermeldung zu definieren:
error "Diese Fehlermeldung besagt nichts!" display dialog "Das Skript läuft weiter."
Jetzt haben wir eine Fehlermeldung, die auch nicht viel mehr aussagt - aber sie ist zumindest von uns selbst erdacht.
Für unser Vorhaben, eine Fehlerliste zu erstellen, nützt uns das allerdings nicht viel aber wir haben zumindest einmal die Möglichkeit kennen gelernt, eine eigene Fehlermeldung zu erstellen.
Wer schon einige Zeit mit AppleScript verbracht hat, wird festgestellt haben, dass die auftretenden Fehler eine negative Nummer haben. Wenn wir in einem Dialog auf den "Abbrechen"-Button klicken, wird z.B. der Fehler mit der Nummer -128 produziert.
In unserem Skript können wir natürlich auch einen Fehler anhand einer Fehlernummer erzeugen.
error number -30000 display dialog "Das Skript läuft weiter."
Nun erhalten wir die Fehlermeldung: Es ist ein Fehler "-30000" aufgetreten. Jetzt sind wir wieder so weit, dass wir eine völlig nichtssagende Fehlermeldung haben. - Aber wir können ja zusätzlich auch noch einen Fehlertext angeben:
error "Ich habe keine Lust mehr und schalte jetzt ab." number -30000 display dialog "Das Skript läuft weiter."
Die Fehlernummer ist nun in der Meldung nicht mehr zu sehen - nur noch der Fehlertext.
Jetzt wollen wir uns aber endlich unserem Skriptvorhaben zuwenden. Die Idee, die dahinter steckt ist ganz simpel: In einem Try-Block wird ein Fehler erzeugt, dessen Fehlermeldung im 'on error'-Teil abgefangen wird.
try error number -128 on error errMsg number errNr log errNr log errMsg end try
Im Eventprotokoll wird nun folgendes angezeigt:
(*-128*) (*Vom Benutzer abgebrochen.*)
Um die Sache nun systematisch anzugehen, verwenden wir natürlich eine Schleife. Die Fehlernummer muss selbstverständlich in jedem Schleifendurchlauf erhöht werden, aber das sollte für uns kein Problem sein. Wir benutzen für die Fehlernummer eine Property-Variable, dann kann man das Skript mehrmals hintereinander laufen lassen und kann somit erst mal kleinere Häppchen erfassen.
Da wir negative Fehlernummern brauchen, setzen wir vor diese Variable ein Minuszeichen.
Das Skript sieht nun so aus:
property n : 0
repeat 100 times try error number -n on error errMsg number errNr log errNr log errMsg end try set n to n + 1 end repeat
Wenn wir unser Skript nun einmal laufen lassen, werden wir im Eventprotokoll schon viele interessante Fehlermeldungen entdecken. Was jedoch auffällt, ist dass recht oft der Text "Es ist ein Fehler aufgetreten" vorkommt. Dieser Text erscheint bei allen, nicht belegten Fehlernummern. Für unsere Fehlerliste ist er selbstverständlich uninteressant und wird deshalb mit einer Bedingung ausgeklammert.
property n : 0
repeat 100 times try error number -n on error errMsg number errNr if errMsg does not start with "Es ist ein Fehler" then log errNr log errMsg end if end try set n to n + 1 end repeat
Das Wichtigste haben wir im Prinzip schon. Eine schöne Fehlerliste ist es jedoch nicht, wenn wir alles im Eventprotokoll zusammen suchen müssen. Deshalb schreiben wir die Fehlernummer und den dazu gehörigen Fehlertext lieber in eine Datei. Den entsprechenden Handler werde ich jedoch nicht extra erläutern - das kann man in den beiden Artikeln zum "Write"-Befehl nachlesen.
Eine Besonderheit wäre noch zu erwähnen: Der Fehler mit der Nummer - 2739 führt leider dazu, dass unser Skript nur noch den Sat1-Ball zeigt. Den Grund hierfür kenne ich nicht. Ich habe deswegen an der Stelle, wo die Fehlernummer erhöht wird eine zusätzliche Bedingung eingebaut, so dass von der Fehlernummer -2738 gleich zur Nummer -2740 gesprungen wird.
Hier nun das Skript:
property FilePath : (path to desktop as string) & "Fehler-Liste" property n : 0
repeat 1000 times try error number -n on error errMsg number errNr if errMsg does not start with "Es ist ein Fehler" then set Fehlertext to errNr & tab & errMsg writeCodes(Fehlertext) -- log (errNr as string) & tab & errMsg end if end try if errNr = -2738 then set n to n + 2 else set n to n + 1 end if end repeat log n
on writeCodes(Fehlertext) set tRef to (open for access file FilePath with write permission) set Datei_Ende to (get eof tRef) if Datei_Ende = 0 then set neuerText to Fehlertext else set neuerText to return & Fehlertext end if try write neuerText to tRef starting at Datei_Ende + 1 close access tRef on error close access tRef end try end writeCodes
Anfangs hatte ich erwähnt, dass Fehler auch ganz nützlich sein können. Wie das denn? - Wenn wir Fehler in einem Try-Block abfangen, ist es meist nicht sinnvoll, dass der Rest des Skripts noch ausgeführt wird. Ganz simples Beispiel: Innerhalb eines Try-Blocks wird ein Dialog ausgegeben. Im Falle, dass jemand auf den Button "Abbruch" klickt, sollte das Skript auch wirklich abbrechen.
try display dialog "Bitte auf \"Abbruch\" klicken." on error return end try
display dialog ¬ "Dieser Dialog dürfte nach dem Abbrechen nicht erscheinen."
Im 'on error'-Teil des Try-Blocks schreiben wir für gewöhnlich 'return', damit das Skript im Fehlerfall abbricht. 'return' besitzt in AppleScript jedoch viele Fähigkeiten. Innerhalb eines Handlers sorgt es dafür, dass wir genau angeben können, welcher Wert vom Handler an das Hauptskript zurück geliefert werden soll. Wir platzieren unseren Try-Block nun innerhalb eines Handlers. Wenn ein Fehler auftritt, sorgt 'return' im 'on error'-Teil lediglich dafür, dass der Handler verlassen wird - der Rest vom Skript wird jedoch ausgeführt. Dies können wir umgehen, indem wir im 'on error'-Teil statt 'return' den Fehler -128 (also Abbruch durch den Benutzer) produzieren. Hier ein kleines Skript zum ausprobieren:
on doJob() try -- produziere Fehler error number -3000 on error -- beende das Skript error number -128 -- zum Testen die obige Zeile auskommentieren return end try end doJob
doJob() -- Handleraufruf display dialog "Das Skript läuft weiter!"
Dies ist sicherlich nicht die einzige Anwendungsmöglichkeit. Wenn man die Fehlernummern kennt, kann man auch bestimmte Fehler gezielt abfangen und je nach Fehler unterschiedlich darauf reagieren. Deshalb sollte jeder nun gaaaanz viele Fehler machen und sich die nützliche Fehlerliste erstellen. Noch eine kleine Anmerkung zu den Fehlermeldungen: In diversen Meldungen kommt der Begriff „«script»“ vor. Es handelt sich in diesem Fall um eine Variable, die den Namen des Objekts enthält, welches vom Fehler betroffen ist.
Nun wünsche ich aber viel Spass beim Erzeugen der Fehlerliste.
|