about_Try_Catch_Finally
Kurze Beschreibung
Beschreibt, wie sie die try
catch
finally
Blöcke zum Behandeln von Beendigungsfehlern verwenden.
Lange Beschreibung
Verwenden Sie try
, catch
und finally
blockieren Sie, um auf Beendigungsfehler in Skripts zu reagieren oder zu behandeln. Die Trap
Anweisung kann auch zum Behandeln von Beendigungsfehlern in Skripts verwendet werden. Weitere Informationen finden Sie unter about_Trap.
Ein Beendigungsfehler stoppt die Ausführung einer Anweisung. Wenn PowerShell einen Beendigungsfehler auf irgendeine Weise nicht verarbeitet, beendet PowerShell auch die Ausführung der Funktion oder des Skripts mithilfe der aktuellen Pipeline. In anderen Sprachen, z. B. C#, werden Abbruchfehler als Ausnahmen bezeichnet.
Verwenden Sie den try
Block, um einen Abschnitt eines Skripts zu definieren, in dem PowerShell auf Fehler überwacht werden soll. Wenn innerhalb des try
Blocks ein Fehler auftritt, wird der Fehler zuerst in der $Error
automatischen 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 geeigneten Block oder Trap
einer entsprechenden catch
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 Fehlerdatenstrom 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 erfasst werden. 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 sie den try
catch
in der C#-Programmiersprache verwendeten Schlüsselwörtern .finally
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
Block oder einen finally
Block aufweisen.
Im Folgenden wird die try
Blocksyntax veranschaulicht:
try {<statement list>}
Auf das try
Schlüsselwort folgt eine Anweisungsliste in geschweiften Klammern. Wenn ein Beendigungsfehler 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 veranschaulicht:
catch [[<error type>][',' <error type>]*] {<statement list>}
Fehlertypen werden in Klammern angezeigt. Die äußersten Klammern geben an, dass das Element optional ist.
Auf das catch
Schlüsselwort folgt eine optionale Liste der Fehlertypspezifikationen und eine Anweisungsliste. Wenn ein Beendigungsfehler 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 alle fehler, die try
im Block aufgetreten sind. Eine try
Anweisung kann mehrere catch
Blöcke für die verschiedenen angegebenen Fehlertypen enthalten.
Im Folgenden wird die finally
Blocksyntax veranschaulicht:
finally {<statement list>}
Auf das finally
Schlüsselwort 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 durch Drücken von STRG+C die Pipeline beendet wird. Objekte, die an die Pipeline gesendet werden, werden nicht als Ausgabe angezeigt. Wenn Sie daher eine anzuzeigende Anweisung einschließen, z. B. "Endlich Block wurde ausgeführt", wird sie 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." }
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" trifft, verursacht es einen Beendigungsfehler. Der catch
Block behandelt den Fehler, indem die Anweisungsliste innerhalb des Blocks ausgeführt wird.
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 heruntergeladen MyDoc.doc
wird 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 System.Net.WebException - und System.IO.IOException-Typen . Der zweite catch
Block gibt keinen Fehlertyp an. Der zweite catch
Block behandelt alle anderen Abbruchfehler, die auftreten.
PowerShell gleicht Fehlertypen nach Vererbung ab. 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 catch
Block, der einen Fehler "Command Not Found" 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 "Befehl nicht gefunden" erfasst:
catch [System.SystemException] {"Base Exception" }
Dieser catch
Block behandelt den Fehler "Command Not Found" 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 catch
Block für die 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 Catch-Block.
Verwenden von Traps in einem Try Catch
Wenn ein Beendigungsfehler in einem try
Block mit einem Trap
definierten Innerhalb des try
Blocks auftritt, selbst wenn ein übereinstimmender catch
Block vorhanden ist, übernimmt die Trap
Anweisung die Steuerung.
Wenn ein Block Trap
mit einem höheren Block als dem try
vorhanden ist und es keinen übereinstimmenden catch
Block innerhalb des aktuellen Bereichs gibt, übernimmt dies Trap
die Steuerung, auch wenn ein übergeordneter Bereich über einen übereinstimmenden catch
Block verfügt.
Zugreifen auf Ausnahmeinformationen
Innerhalb eines catch
Blocks kann mithilfe $_
des aktuellen Fehlers zugegriffen werden, der auch als $PSItem
". 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. Beispiel: Wenn das Skript wie folgt geändert wird:
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, die schließlich verwendet werden
Um Ressourcen freizugeben, die von einem Skript verwendet werden, fügen Sie einen finally
Block nach den try
und catch
Blöcken hinzu. Die finally
Blockanweisungen werden unabhängig davon ausgeführt, ob der try
Block auf einen Beendigungsfehler stößt. PowerShell führt den finally
Block aus, bevor das Skript beendet wird oder bevor der aktuelle Block den Gültigkeitsbereich überschreitet.
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 innerhalb eines catch
Blocks stoppt.