Try

Schützt eine oder mehrere Anweisungen vor Laufzeitfehlern und via Throw ausgelösten Werten.

Try Anweisung
Try
{
    Anweisungen
}

Bemerkungen

Nach einem Try erfolgt üblicherweise ein Block (eine oder mehrere Anweisungen, die von geschweiften Klammern umschlossen sind). Wenn nur eine einzige Anweisung verwendet wird, kann diese direkt neben Try gesetzt werden, oder darunter ohne geschweifte Klammern. Um Code anzugeben, der nur ausgeführt wird, wenn Try einen Fehler abfängt, verwenden Sie eine oder mehrere Catch-Anweisungen.

Wenn Try ohne Catch oder Finally verwendet wird, ist dies äquivalent zu catch Error mit einem leeren Block.

Ein Wert kann entweder mit Throw oder durch das Programm beim Auftreten eines Laufzeitfehlers geworfen (ausgelöst) werden. Wenn ein Wert innerhalb eines Try-Blocks oder einer Funktion, die von einem solchen Block aufgerufen wird, geworfen wird, geschieht Folgendes:

Nach dem letzten Catch kann optional ein Else folgen. Wenn die Try-Anweisung endet, ohne dass eine Ausnahme ausgelöst wird (und ohne dass die Kontrolle durch Return, Break etc. woanders hin transferiert wird), wird die Else-Anweisung ausgeführt. Ausnahmen, die durch Else ausgelöst werden, werden nicht vom zugehörigen Try behandelt, können aber von einem umschließenden Try behandelt werden. Finally kann auch vorhanden sein, muss aber nach Else folgen und wird immer zuletzt ausgeführt.

Je nach Bedarf kann der One True Brace (OTB) Style bei einem Try verwendet werden. Zum Beispiel:

try {
    ...
} catch Error as Fehler {
    ...
} else {
    ...
} finally {
    ...
}

Throw, Catch, Else, Finally, Blöcke, OnError

Beispiele

Zeigt das Grundkonzept von Try-Catch und Throw.

try  ; Versucht den Code auszuführen.
{
    HalloWelt
    MacheToast
}
catch as e  ; Behandelt den ersten Fehler, ausgelöst durch den vorherigen Block.
{
    MsgBox "Ein Fehler wurde ausgelöst!`nSpeziell: " e.Message
    Exit
}

HalloWelt()  ; Ist immer erfolgreich.
{
    MsgBox "Hallo, Welt!"
}

MacheToast()  ; Schlägt immer fehl.
{
    ; Sofort zur Fehlerbehandlung des Try-Blocks springen:
    throw Error(A_ThisFunc " ist nicht implementiert, sorry")
}

Zeigt die grundlegende Fehlerbehandlung von internen Funktionen.

try
{
    ; Nachfolgend wird versucht, bestimmte Dateitypen zu sichern:
    FileCopy A_MyDocuments "\*.txt", "D:\Backup\Textdokumente"
    FileCopy A_MyDocuments "\*.doc", "D:\Backup\Textdokumente"
    FileCopy A_MyDocuments "\*.jpg", "D:\Backup\Fotos"
}
catch
{
    MsgBox "Beim Sichern der Dateien ist ein Fehler aufgetreten!",, "IconX"
    ExitApp 1
}
else
{
    MsgBox "Sicherung erfolgreich."
    ExitApp 0
}

Zeigt die Verwendung von Try-Catch bei COM-Fehlern. Einzelheiten über das hier verwendete COM-Objekt finden Sie unter Using the ScriptControl (Microsoft Docs).

try
{
    obj := ComObject("ScriptControl")
    obj.ExecuteStatement('MsgBox "Dies ist ein eingebettetes VBScript"')  ; Diese Zeile erzeugt einen Error.
    obj.InvalidMethod()  ; Diese Zeile würde einen MethodError erzeugen.
}
catch MemberError  ; Deckt MethodError und PropertyError ab.
{
    MsgBox "Wir haben versucht, ein Element indirekt aufzurufen, das nicht existiert."
}
catch as e
{
    ; Um mehr über das Objekt zu erfahren, das in e enthalten ist, siehe Error-Objekt.
    MsgBox("Ausnahme ausgelöst!`n`nWas: " e.what "`nDatei: " e.file 
        . "`nZeile: " e.line "`nNachricht: " e.message "`nZusatz: " e.extra,, 16) 
}

Zeigt verschachtelte Try-Catch-Anweisungen.

try Beispiel1 ; Einzelanweisungen können neben dem Try stehen.
catch Number as e
    MsgBox "Beispiel1() hat " e " ausgelöst."

Beispiel1()
{
    try Beispiel2
    catch Number as e
    {
        if (e = 1)
            throw ; Den abgefangenen Wert erneut auslösen und an unseren Aufrufer weiterleiten.
        else
            MsgBox "Beispiel2() hat " e " ausgelöst."
    }
}

Beispiel2()
{
    throw Random(1, 2)
}