Registriert eine Funktion, die jedes Mal automatisch aufgerufen wird, wenn ein unbehandelter Fehler auftritt.
OnError Rückruf , HinzufügenEntfernen
Typ: Funktionsobjekt
Eine Funktion, die aufgerufen werden soll.
Die Rückruffunktion akzeptiert zwei Parameter und kann wie folgt definiert werden:
MeinRückruf(ThrowWert, Modus) { ...
Es spielt keine Rolle, welche Namen Sie den Parametern geben, allerdings werden ihnen die folgenden Werte nacheinander zugewiesen:
Es können beliebig viele Parameter am Ende der Parameterliste der Rückruffunktion weggelassen werden, wenn die entsprechenden Informationen nicht benötigt werden, aber dann muss als letzter Parameter ein Sternchen angegeben werden, z.B. MeinRückruf(Param1, *)
.
Die Rückruffunktion kann einen der folgenden Werte zurückgeben (andere Werte sind für zukünftige Zwecke reserviert und sollten vermieden werden):
0
, ""
oder kein Return: Fehlerbehandlung normal fortsetzen lassen.1
: Das reguläre Fehlerdialogfenster und alle verbleibenden Rückruffunktionen unterdrücken.-1
: Wie oben, aber wenn Modus (der zweite Parameter) das Wort Return enthält, darf die Ausführung des aktuellen Threads fortgesetzt werden.Typ: Integer
Wenn weggelassen, wird standardmäßig 1 verwendet. Andernfalls geben Sie eine der folgenden Zahlen an:
Modus | Beschreibung |
---|---|
Return | Der geworfene Wert ist ein fortsetzbarer Laufzeitfehler. Der Thread wird fortgesetzt, wenn die Rückruffunktion -1 zurückgibt, andernfalls wird der Thread beendet. |
Exit | Der geworfene Wert ist ein nicht-fortsetzbarer Laufzeitfehler oder ein vom Skript geworfener Wert. Der Thread wird beendet. |
ExitApp | Der geworfene Wert ist ein kritischer Laufzeitfehler, z.B. eine von DllCall erkannte Datenbeschädigung. Das Programm wird beendet. |
Rückruf wird nur bei Fehlern oder Ausnahmen aufgerufen, die normalerweise zu einer Fehlermeldung führen würden. Ladezeitfehler gehören nicht dazu, da OnError erst nach dem Laden des Skripts aufgerufen werden kann.
Rückruf wird im aktuellen Thread vor seiner Beendigung aufgerufen (also bevor der Aufrufstapel abgearbeitet wurde).
Protokolliert vom Skript verursachte Fehler in einer Textdatei, anstatt sie dem Benutzer anzuzeigen.
OnError FehlerProtokollieren i := Integer("Fehler_verursachen") FehlerProtokollieren(Exception, Modus) { FileAppend "Fehler bei Zeile " Exception.Line ": " Exception.Message "`n" , "Fehlerprotokoll.txt" return true }
Verwenden Sie OnError, um alternative Fehlerbehandlungsmethoden zu implementieren. Einschränkung: OnError ist unwirksam, während Try aktiv ist.
MehrereFehlerAkkumulieren() { local ea := FehlerAkkumulator() ea.Start() return ea } class FehlerAkkumulator { Errors := [] ; Array für akkumulierte Fehler. _cb := FehlerAkkumulieren.Bind(this.Errors) Start() => OnError(this._cb, -1) ; Unsere cb vor allen anderen registrieren. Stop() => OnError(this._cb, 0) ; Unsere cb deregistrieren. Last => this.Errors[-1] ; Aktuellster Fehler. Count => this.Errors.Length ; Anzahl der akkumulierten Fehler. __item[i] => this.Errors[i] ; Shortcut für Indexierung. __delete() => this.Stop() ; Zum Binden an Gültigkeitsbereich der Funktion. } ; Nachfolgend die OnError-Rückruffunktion. 'errors' bekommt einen Wert via Bind() zugewiesen. FehlerAkkumulieren(errors, e, mode) { if mode != "Return" ; Nicht fortsetzbar. return if e.What = "" ; Ausdrucksfehler oder ähnliches, keine interne Funktion. return try { ; Versuchen, den Fehler in stdout auszugeben. FileAppend Format("{1} ({2}) : ({3}) {4}`n", e.File, e.Line, e.What, e.Message), "*" if HasProp(e, "extra") FileAppend " Specifically: " e.Extra "`n", "*" } errors.Push(e) return -1 ; Weiter. } FensterNeuanordnen() { ; Beginnen, Fehler in 'err' zu akkumulieren. local err := MehrereFehlerAkkumulieren() ; Einige Dinge tun, die fehlschlagen können... MonitorGetWorkArea , &Links, &Oben, &Rechts, &Unten Breite := (Rechts-Links)//2, Höhe := Unten-Oben WinMove Links, Oben, Breite, Höhe, A_ScriptFullPath WinMove Links+Breite, Oben, Breite, Höhe, "Hilfe für AutoHotkey v2" ; Prüfen, ob Fehler aufgetreten sind. if err.Count MsgBox err.Count " Fehler; letzter Fehler auf Zeile Nr. " err.Last.Line else MsgBox "Keine Fehler" ; Stop wird automatisch aufgerufen, wenn die Variable den Gültigkeitsbereich ; verlässt, da nur wir eine Referenz zum Objekt haben. Dies führt dazu, ; dass OnError aufgerufen wird, um die Rückruffunktion zu deregistrieren. ;err.Stop() } ; Testfunktion aufrufen, die Fehler unterdrückt und akkumuliert. FensterNeuanordnen() ; Andere Funktion aufrufen, um zu zeigen, dass normales Fehlerverhalten wiederhergestellt ist. WinMove 0, 0, 0, 0, "Nicht-existierendes Fenster"