Fischer-Bayern.de
Click Here To Visit Our Sponsor
Letztes Update: 10.05.2005 | 21:47:00 Uhr
Fehler 
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.




 

 

Workshop



snow@fischer-bayern.de

Ebene 1