Freigeben über


about_Try_Catch_Finally

Kurze Beschreibung

Beschreibt, wie die tryBlöcke , catchund finally zum Behandeln von Abschlussfehlern verwendet werden.

Lange Beschreibung

Verwenden Sie try, catchund finally Blöcke, um auf Abbruchfehler in Skripts zu reagieren oder diese zu behandeln. Die Trap -Anweisung kann auch verwendet werden, um Abschlussfehler in Skripts zu behandeln. Weitere Informationen finden Sie unter about_Trap.

Ein Abbruchfehler stoppt die Ausführung einer Anweisung. Wenn PowerShell einen Abbruchfehler nicht in irgendeiner Weise behandelt, beendet PowerShell auch die Ausführung der Funktion oder des Skripts mithilfe der aktuellen Pipeline. In anderen Sprachen, z. B. C#, werden Abschlussfehler als Ausnahmen bezeichnet.

Verwenden Sie den try Block, um einen Abschnitt eines Skripts zu definieren, in dem PowerShell auf Fehler überwachen soll. Wenn innerhalb des try Blocks ein Fehler auftritt, wird der Fehler zuerst in der automatischen $Error Variablen gespeichert. PowerShell sucht dann nach einem catch Block, um den Fehler zu behandeln. Wenn die try Anweisung keinen übereinstimmenden catch Block aufweist, sucht PowerShell weiterhin nach einem entsprechenden catch Block oder Trap einer Anweisung in den übergeordneten Bereichen. Nachdem ein catch Block abgeschlossen wurde oder kein entsprechender Block oder Trap keine entsprechende catch Anweisung gefunden wurde, wird der finally Block ausgeführt. Wenn der Fehler nicht behandelt werden kann, wird der Fehler in den Fehlerstream geschrieben.

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

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

try, catchund finally ähneln den trySchlüsselwörtern , catchund, die finally in der Programmiersprache C# verwendet werden.

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 catch oder einen finally Block aufweisen.

Im Folgenden wird die Blocksyntax try veranschaulicht:

try {<statement list>}

Auf die try Schlüsselwort (keyword) folgt eine Anweisungsliste in Klammern. Wenn während der Ausführung der Anweisungen in der Anweisungsliste ein Abbruchfehler auftritt, übergibt das Skript das Fehlerobjekt vom try Block an einen entsprechenden catch Block.

Im Folgenden wird die Blocksyntax catch veranschaulicht:

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

Fehlertypen werden in Klammern angezeigt. Die äußersten Klammern weisen darauf hin, dass das Element optional ist.

Auf die catch Schlüsselwort (keyword) folgen eine optionale Liste von Fehlertypspezifikationen und eine Anweisungsliste. Wenn im try Block ein Abbruchfehler auftritt, sucht PowerShell nach einem entsprechenden 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 verarbeitet Fehler der angegebenen .NET Framework Ausnahmeklasse oder einer beliebigen Klasse, die von der angegebenen Klasse abgeleitet ist.

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

Im Folgenden wird die Blocksyntax finally veranschaulicht:

finally {<statement list>}

Auf finally die Schlüsselwort (keyword) folgt eine 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 abgefangen wurde.

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

Abfangen von Fehlern

Das folgende Beispielskript zeigt einen try Block mit einem catch Block:

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

Die catch Schlüsselwort (keyword) muss sofort dem try Block oder einem anderen catch Block folgen.

PowerShell erkennt "NonsenseString" nicht als Cmdlet oder ein anderes Element. Das Ausführen dieses Skripts gibt das folgende Ergebnis zurück:

An error occurred.

Wenn das Skript auf "NonsenseString" stößt, verursacht dies einen Abbruchfehler. Der catch Block behandelt den Fehler, indem er die Anweisungsliste im Block ausführt.

Verwenden mehrerer Catch-Anweisungen

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

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 Abschlussfehler, die auftreten.

PowerShell vergleicht Fehlertypen durch Vererbung. Ein catch Block verarbeitet Fehler der angegebenen .NET Framework Ausnahmeklasse oder einer beliebigen Klasse, die von der angegebenen Klasse abgeleitet ist. Das folgende Beispiel enthält einen catch Block, der den Fehler "Command Not Found" abfängt:

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

Der angegebene Fehlertyp CommandNotFoundException erbt vom System.SystemException-Typ . Im folgenden Beispiel wird auch der Fehler "Befehl nicht gefunden" abfangen:

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 ihrer abgeleiteten Klassen angeben, platzieren Sie den catch Block für die abgeleitete Klasse vor dem catch Block für die allgemeine Klasse.

Hinweis

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

Verwenden von Traps in einem Try Catch

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

Wenn ein Trap in einem höheren Block als vorhanden tryist und es keinen übereinstimmenden catch Block innerhalb des aktuellen Bereichs gibt, übernimmt der Trap die Kontrolle, auch wenn ein übergeordneter Bereich über einen übereinstimmenden catch Block verfügt.

Zugreifen auf Ausnahmeinformationen

In einem catch Block kann mithilfe $_von auf den aktuellen Fehler zugegriffen werden. Dies wird auch als $PSItembezeichnet. Das Objekt ist vom Typ ErrorRecord.

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

Das Ausführen dieses Skripts gibt das folgende Ergebnis zurück:

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 wie folgt ändern:

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

Das Ergebnis ähnelt folgendem:

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

Freigeben von Ressourcen mithilfe von "endlich"

Um von einem Skript verwendete Ressourcen freizugeben, fügen Sie einen finally Block nach den try Blöcken und catch hinzu. Die finally Blockanweisungen werden unabhängig davon ausgeführt, ob für den try Block ein Abbruchfehler auftritt. PowerShell führt den finally Block aus, bevor das Skript beendet wird oder bevor der aktuelle Block aus dem Gültigkeitsbereich ausläuft.

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 (keyword) das Skript in einem catch Block anhält.

Weitere Informationen