OnError

Registriert eine Funktion, die jedes Mal automatisch aufgerufen wird, wenn ein unbehandelter Fehler auftritt.

OnError Rückruf , HinzufügenEntfernen

Parameter

Rückruf

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:

  1. Der geworfene Wert, was üblicherweise ein Error-Objekt ist.
  2. Der Fehlermodus: Return, Exit oder ExitApp. Einzelheiten finden Sie in der unteren Tabelle.

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):

HinzufügenEntfernen

Typ: Integer

Wenn weggelassen, wird standardmäßig 1 verwendet. Andernfalls geben Sie eine der folgenden Zahlen an:

Fehlermodi

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.

Bemerkungen

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).

Try, Catch, Throw, OnExit

Beispiele

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"