about_Try_Catch_Finally
Kurze Beschreibung
Beschreibt, wie die try
Blöcke , catch
und finally
zum Behandeln von Abschlussfehlern verwendet werden.
Lange Beschreibung
Verwenden Sie try
, catch
und 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
, catch
und finally
ähneln den try
Schlüsselwörtern , catch
und, 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.doc
und 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 try
Trap
definierten Block ein Abbruchfehler auftritt, übernimmt die try
Trap
Anweisung die Kontrolle, selbst wenn ein übereinstimmender catch
Block vorhanden ist.
Wenn ein Trap
in einem höheren Block als vorhanden try
ist 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 $PSItem
bezeichnet. 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.