7.7 Fehlerbehandlung

Es gibt verschiedene Möglichkeiten, mit Fehlern in Hollywood umzugehen. Am einfachsten ist es, wenn Hollywood das alles für Sie erledigt und ist auch so Voreingestellt. Standardmäßig wird Hollywood Ihr Skript immer beenden, wenn ein Fehler in einem Hollywood-Befehl auftritt. Betrachten Sie den folgenden Code:

 
LoadBrush (1, "xyz")

Wenn die Datei xyz nicht existiert, beendet Hollywood Ihr Skript und meldet folgenden Fehler: "Datei xyz kann nicht gelesen werden!"

Wenn Ihnen dieses Verhalten nicht gefällt, können Sie Hollywood auch anweisen, eine von Ihnen erstellte Funktion aufzurufen, wenn ein Fehler auftritt. Dies ist durch den Aufruf des Befehls RaiseOnError() möglich, der die von Ihnen definierte Callback-Funktion aufruft, wenn ein Fehler auftritt. Hier ist ein Beispiel, wie Sie Hollywoods Standardfehlerbehandlung mit einem benutzerdefinierten Fehlerhandler ersetzen können:

 
Function p_ErrorFunc(code, msg$, cmd$, line)
   DebugPrint(code, msg$, cmd$, line)
EndFunction
RaiseOnError(p_ErrorFunc)
LoadBrush(1, "xyz")

Wenn Sie den obigen Code verwenden, lädt LoadBrush() den Pinsel xyz. Falls diese Datei nicht existiert, wird nicht Hollywoods-Standardfehlerhandler ausgelöst, sondern stattdessen die Benutzerfunktion p_ErrorFunc() aufgerufen und gibt so weitere Informationen über den aufgetretenen Fehler aus. Siehe RaiseOnError für Details.

Manchmal kann es jedoch nützlich sein zu wissen, ob ein einzelner Befehl erfolgreich war oder nicht. Dies kann erreicht werden, indem der Hollywood-Fehlerhandler vorübergehend deaktiviert wird, um den Fehlercode vom letzten Befehl zu erhalten:

 
ExitOnError(False)       ; Deaktiviert den Standardfehlerhandler
LoadBrush(1, "xyz")
error = GetLastError()
ExitOnError(True)        ; Aktiviert den Standardfehlerhandler

Der obige Code deaktiviert vorübergehend Hollywoods Standardfehlerbehandlung nur für die Dauer des Befehls LoadBrush(). Direkt nach dem LoadBrush() benutzen Sie den Befehl GetLastError(), um herauszufinden, ob der Befehl LoadBrush() erfolgreich war oder nicht. Es ist wichtig, GetLastError() unmittelbar nach LoadBrush() zu benutzen, da beim nächsten Befehl der interne Fehler-Flag zurückgesetzt wird. Wenn Sie also einen anderen Befehl nach LoadBrush() aufrufen, wird GetLastError() den Fehlerstatus dieses Befehls anstelle von LoadBrush() zurück geben.

Da der obige Code viel Schreibaufwand für eine ziemlich einfache Aufgabe erfordert, gibt es auch eine syntaktische Vereinfachung, die das gleiche wie oben bewirkt und so die Menge der erforderlichen Eingaben reduziert. Anstatt wie oben gezeigt ExitOnError() und GetLastError() manuell aufzurufen , können Sie auch Hollywood alles automatisch erledigen lassen, indem Sie einfach dem Befehl ein Fragezeichen voranstellen. So könnte der obige Code auch so geschrieben werden:

 
error = ?LoadBrush(1, "xyz")

Wenn ein Befehl Werte zurückgibt und Sie ein Fragezeichen verwenden, um einen Fehlercode aus einem Befehlsaufruf zu erhalten, werden alle anderen Rückgabewerte einfach nach rechts verschoben. Der Fehlercode ist immer der erste Rückgabewert. Wenn wir zum Beispiel die automatische ID-Zuweisung mit dem Befehl LoadBrush() verwenden und dies mit dem Fragezeichensyntax kombinieren wollen, müssen wir den Code so schreiben:

 
error, id = ?LoadBrush(Nil, "xyz")

Normalerweise wäre id der erste Rückgabewert, aber da wir die Fragezeichensyntax verwenden, um einen Fehlercode vom Befehl LoadBrush() zu erhalten, wird der erste Rückgabewert nach rechts verschoben und wird jetzt zum zweiten Rückgabewert. Der Fehlercode ist immer im ersten Rückgabewert enthalten.

Um schließlich zu prüfen, ob ein Fehler aufgetreten ist, müssen Sie lediglich den Fehlercode error mit #ERR_NONE vergleichen, der zur Vereinfachung als 0 definiert ist. D.h. wenn error nicht 0 ist, wissen Sie, dass etwas schief gelaufen ist. Sie könnten dann GetErrorName() verwenden, um den Fehlercode in eine für Menschen lesbare Zeichenfolge zu konvertieren oder eine benutzerdefinierte Fehlerbehandlung in Abhängigkeit vom eingestellten Fehlercode implementieren. Siehe Fehlercodes für eine Liste aller Fehlercodes.

Bitte beachten Sie, dass einige Fehler nicht erfasst werden können. Wenn Sie beispielsweise eine falsche Anzahl von Argumenten oder falsche Variablentypen an einen Befehl übergeben, wird Hollywood immer sofort mit einem schwerwiegenden Fehler beendet, und Ihrem Skript wird keine Chance zum Auffinden solcher Fehler gegeben. Obwohl sie zur Laufzeit auftreten, wird Hollywood bei solchen Syntaxfehler sofort beendet. Hier ist ein Beispiel, wo wir eine Zeichenfolge im ersten Argument vom Befehl LoadBrush() übergeben, was nicht erlaubt ist, weil LoadBrush() eine Zahl erwartet:

 
ExitOnError(False)
LoadBrush("Hello", "xyz")
ExitOnError(True)

Obwohl wir den Fehlerhandler von Hollywood deaktiviert haben, indem wir False an ExitOnError() übergeben, wird Hollywood die Ausführung des Skripts sofort abbrechen, weil "Hello" an LoadBrush() übergeben wurde, was einfach falsch ist. Hollywood wird dies als einen fatalen Fehler betrachten und Ihrem Skript nicht erlauben, diesen Fehler in irgendeiner Weise abzufangen.


Navigation zeigen