Freigeben über


about_Try_Catch_Finally

Kurze Beschreibung

Beschreibt, wie sie die trycatchfinally Blöcke zum Behandeln von Beendigungsfehlern verwenden.

Lange Beschreibung

Verwenden Sie try, catchund 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, catchund finally ähneln sie den trycatchin 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.docwird 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 tryvorhanden 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.

Siehe auch