about_Try_Catch_Finally

Kurze Beschreibung

Beschreibt, wie Sie die trycatch, und finally Blöcke zum Behandeln von Terminierungsfehlern verwenden.

Lange Beschreibung

Verwenden Sie try, catchund blockieren Sie finally , um auf Terminierungsfehler in Skripts zu reagieren oder zu behandeln. Die Trap Anweisung kann auch zum Behandeln von Terminierungsfehlern in Skripts verwendet werden. Weitere Informationen finden Sie unter about_Trap.

Ein Abbruchfehler beendet eine Anweisung, die ausgeführt wird. Wenn PowerShell keinen Abbruchfehler verarbeitet, beendet PowerShell auch die Ausführung der Funktion oder des Skripts mithilfe der aktuellen Pipeline. In anderen Sprachen, z. B. C#, werden Terminierungsfehler als Ausnahmen bezeichnet.

Verwenden Sie den try Block, um einen Abschnitt eines Skripts zu definieren, in dem PowerShell für Fehler überwacht werden soll. Wenn ein Fehler innerhalb des Blocks auftritt, wird der Fehler zuerst in der try$Error automatischen Variable gespeichert. PowerShell sucht dann nach einem catch Block zum Behandeln des Fehlers. Wenn die try Anweisung keinen übereinstimmenden catch Block aufweist, sucht PowerShell weiterhin nach einem geeigneten catch Block oder Trap einer Anweisung in den übergeordneten Bereichen. Nachdem ein catch Block abgeschlossen wurde oder keine entsprechende catch Block- oder Trap Anweisung gefunden wurde, wird der finally Block ausgeführt. Wenn der Fehler nicht behandelt werden kann, wird der Fehler in den Fehlerstrom geschrieben.

Ein catch Block kann Befehle zum Nachverfolgen des Fehlers oder zum Wiederherstellen des erwarteten Flusses des Skripts enthalten. Ein catch Block kann angeben, welche Fehlertypen sie abfangen. Eine try Anweisung kann mehrere Blöcke für verschiedene catch Arten von Fehlern enthalten.

Ein finally Block kann verwendet werden, um ressourcen freizugeben, die von Ihrem Skript nicht mehr benötigt werden.

trycatch, und ähnelt den catchtryin der C#-Programmiersprache verwendeten Schlüsselwörtern , und finallyfinally ähnelt den Schlüsselwörtern.

Syntax

Eine try Anweisung enthält einen try Block, null oder mehr catch Blöcke und null oder einen finally Block. Eine try Anweisung muss mindestens einen Block oder einen catchfinally Block aufweisen.

Im Folgenden wird die try Blocksyntax angezeigt:

try {<statement list>}

Das try Schlüsselwort folgt einer Anweisungsliste in Klammern. Wenn ein Abbruchfehler auftritt, während die Anweisungen in der Anweisungsliste ausgeführt werden, übergibt das Skript das Fehlerobjekt vom try Block an einen entsprechenden catch Block.

Im Folgenden wird die catch Blocksyntax angezeigt:

catch [[<error type>][',' <error type>]*] {<statement list>}

Fehlertypen werden in Klammern angezeigt. Die äußeren Klammern geben an, dass das Element optional ist.

Das catch Schlüsselwort folgt einer optionalen Liste der Fehlertypspezifikationen und einer Anweisungsliste. Wenn ein Abbruchfehler im try Block auftritt, sucht PowerShell nach einem geeigneten catch Block. Wenn eine gefunden wird, werden die Anweisungen im catch Block ausgeführt.

Der catch Block kann einen oder mehrere Fehlertypen angeben. Ein Fehlertyp ist eine Microsoft .NET Framework Ausnahme oder eine Ausnahme, die von einer .NET Framework Ausnahme abgeleitet wird. Ein catch Block behandelt Fehler der angegebenen .NET Framework Ausnahmeklasse oder einer beliebigen Klasse, die von der angegebenen Klasse abgeleitet wird.

Wenn ein catch Block einen Fehlertyp angibt, behandelt dieser catch Block diesen Fehlertyp. Wenn ein catch Block keinen Fehlertyp angibt, behandelt dieser catch Block einen Fehler im try Block. Eine try Anweisung kann mehrere catch Blöcke für die verschiedenen angegebenen Fehlertypen enthalten.

Im Folgenden wird die finally Blocksyntax angezeigt:

finally {<statement list>}

Das finally Schlüsselwort folgt einer Anweisungsliste, die jedes Mal ausgeführt wird, wenn das Skript ausgeführt wird, auch wenn die try Anweisung ohne Fehler ausgeführt wurde oder ein Fehler in einer catch Anweisung erfasst wurde.

Beachten Sie, dass das Drücken von STRG+C die Pipeline beendet. Objekte, die an die Pipeline gesendet werden, werden nicht als Ausgabe angezeigt. Wenn Sie daher eine anweisung einschließen, die angezeigt werden soll, z. B. "Endlich block hat ausgeführt", wird es nicht angezeigt, nachdem Sie STRG+C drücken, auch wenn der finally Block ausgeführt wurde.

Abfangen von Fehlern

Das folgende Beispielskript zeigt einen Block mit einem trycatch Block:

try { NonsenseString }
catch { "An error occurred." }

Das catch Schlüsselwort muss sofort dem try Block oder einem anderen catch Block folgen.

PowerShell erkennt "NonsenseString" nicht als Cmdlet oder ein anderes Element. Wenn Sie dieses Skript ausführen, wird das folgende Ergebnis zurückgegeben:

An error occurred.

Wenn das Skript auf "NonsenseString" auftritt, führt es zu einem Terminierungsfehler. Der Block behandelt den Fehler, indem die catch Anweisungsliste innerhalb des Blocks ausgeführt wird.

Verwenden mehrerer Catch-Anweisungen

Eine try Anweisung kann eine beliebige Anzahl von catch Blöcken aufweisen. Das folgende Skript verfügt beispielsweise über einen try Block, der heruntergeladen MyDoc.docwird, und enthält zwei catch Blöcke:

try {
   $wc = new-object System.Net.WebClient
   $wc.DownloadFile("http://www.contoso.com/MyDoc.doc","c:\temp\MyDoc.doc")
}
catch [System.Net.WebException],[System.IO.IOException] {
    "Unable to download MyDoc.doc from http://www.contoso.com."
}
catch {
    "An error occurred that could not be resolved."
}

Der erste catch Block behandelt Fehler der Typen "System.Net.WebException " und "System.IO.IOException ". Der zweite catch Block gibt keinen Fehlertyp an. Der zweite catch Block behandelt alle anderen Abbruchfehler, die auftreten.

PowerShell entspricht Fehlertypen nach Vererbung. Ein catch Block behandelt Fehler der angegebenen .NET Framework Ausnahmeklasse oder einer beliebigen Klasse, die von der angegebenen Klasse abgeleitet wird. Das folgende Beispiel enthält einen Block, der einen catch Fehler "Befehl nicht gefunden" abfangen kann:

catch [System.Management.Automation.CommandNotFoundException]
{"Inherited Exception" }

Der angegebene Fehlertyp, CommandNotFoundException, erbt vom System.SystemException-Typ . Im folgenden Beispiel wird auch ein Fehler "Nicht gefunden" erfasst:

catch [System.SystemException] {"Base Exception" }

Dieser catch Block behandelt den Fehler "Befehl nicht gefunden" und andere Fehler, die vom SystemException-Typ erben .

Wenn Sie eine Fehlerklasse und eine der abgeleiteten Klassen angeben, platzieren Sie den catch Block für die abgeleitete Klasse vor dem Block für die catch allgemeine Klasse.

Hinweis

PowerShell umschließt alle Ausnahmen in einem RuntimeException-Typ . Daher verhält sich die Angabe des Fehlertyps System.Management.Automation.RuntimeException genauso wie ein nicht qualifizierter Fangblock.

Verwenden von Traps in einem Try Catch

Wenn ein Abbruchfehler in einem Block mit einem try definierten try Block auftritt, selbst wenn ein übereinstimmender catch Block vorhanden ist, übernimmt die Trap Anweisung die Trap Kontrolle.

Wenn ein Trap Objekt bei einem höheren Block vorhanden ist als der try, und es gibt keinen übereinstimmenden catch Block im aktuellen Bereich, wird die Trap Kontrolle ausgeführt, auch wenn ein übergeordneter Bereich einen übereinstimmenden catch Block aufweist.

Zugreifen auf Ausnahmeinformationen

Innerhalb eines catch Blocks kann auf den aktuellen Fehler zugegriffen $_werden, der auch als $PSItem"bezeichnet" bezeichnet wird. Das Objekt ist vom Typ ErrorRecord.

try { NonsenseString }
catch {
  Write-Host "An error occurred:"
  Write-Host $_
}

Wenn Sie dieses Skript ausführen, wird das folgende Ergebnis zurückgegeben:

An Error occurred:
The term 'NonsenseString' is not recognized as the name of a cmdlet, function,
script file, or operable program. Check the spelling of the name, or if a path
was included, verify that the path is correct and try again.

Es gibt zusätzliche Eigenschaften, auf die zugegriffen werden kann, z. B. ScriptStackTrace, Exception und ErrorDetails. Wenn wir z. B. das Skript in folgendes ändern:

try { NonsenseString }
catch {
  Write-Host "An error occurred:"
  Write-Host $_.ScriptStackTrace
}

Das Ergebnis ist ähnlich wie folgt:

An Error occurred:
at <ScriptBlock>, <No file>: line 2

Freihanden von Ressourcen, die schließlich verwendet werden

Um von einem Skript verwendete Ressourcen freizugeben, fügen Sie nach den trycatch Blöcken einen finally Block hinzu. Die finally Blockanweisungen werden unabhängig davon ausgeführt, ob der try Block einen Abbruchfehler aufweist. PowerShell führt den finally Block aus, bevor das Skript beendet oder bevor der aktuelle Block außerhalb des Bereichs geht.

Ein finally Block wird auch ausgeführt, wenn Sie STRG+C verwenden, um das Skript zu beenden. Ein finally Block wird auch ausgeführt, wenn ein Exit-Schlüsselwort das Skript in einem catch Block beendet.

Siehe auch