about_Try_Catch_Finally

Letzte Aktualisierung: Mai 2014

Betrifft: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

THEMA

about_Try_Catch_Finally

KURZE BESCHREIBUNG

Beschreibt, wie mit den Try-, Catch- und Finally-Blöcken zum Abbruch führende Fehler behandelt werden können.

LANGE BESCHREIBUNG

Verwenden Sie die Try-, Catch- und Finally-Blöcke, um auf zum Abbruch führende Fehler in Skripts zu reagieren oder diese Fehler zu behandeln. Auch die Trap-Anweisung kann verwendet werden, um zum Abbruch führende Fehler in Skripts zu behandeln. Weitere Informationen finden Sie unter „about_Trap“.

Ein zum Abbruch führender Fehler beendet die Ausführung einer Anweisung. Wenn Windows PowerShell® einen zum Abbruch führenden Fehler nicht auf irgendeine Weise behandelt, beendet Windows PowerShell auch die Ausführung der Funktion oder des Skripts mit der aktuellen Pipeline. In anderen Sprachen wie C# werden zum Abbruch führende Fehler als Ausnahmen bezeichnet. Weitere Informationen zu Fehlern finden Sie unter „about_Errors“.

Verwenden Sie den Try-Block, um einen Abschnitt eines Skripts zu definieren, in dem Windows PowerShell eine Überwachung auf Fehler durchführen soll. Wenn innerhalb des Try-Blocks ein Fehler auftritt, wird der Fehler zunächst in der automatischen Variablen „$Error“ gespeichert. Danach sucht Windows PowerShell nach einem Catch-Block zur Behandlung des Fehlers. Wenn die Try-Anweisung über keinen übereinstimmenden Catch-Block verfügt, setzt Windows PowerShell die Suche nach einem entsprechenden Catch-Block oder einer Trap-Anweisung in den übergeordneten Bereichen fort. Nachdem ein Catch-Block abgeschlossen wurde oder wenn kein entsprechender Catch-Block oder eine Trap-Anweisung gefunden wurde, wird der Finally-Block ausgeführt. Wenn der Fehler nicht behandelt werden kann, wird er in den Fehlerstream geschrieben.

Ein Catch-Block kann Befehle zum Nachverfolgen des Fehlers oder zum Wiederherstellen des erwarteten Skriptflusses enthalten. Ein Catch-Block kann angeben, welche Fehlertypen er abfängt. Eine Try-Anweisung kann mehrere Catch-Blöcke für verschiedene Arten von Fehlern enthalten.

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

Try, Catch und Finally ähneln den Try-, Catch- und Finally-Schlüsselwörter in der Programmiersprache C#.

SYNTAX

Eine Try-Anweisung enthält einen Try-Block, keinen oder mehrere Catch-Blöcke und keinem oder einem Finally-Block. Eine Try-Anweisung muss mindestens einen Catch-Block oder einen Finally-Block enthalten.

Das folgende Beispiel zeigt die Syntax des Try-Blocks:

          try {<statement list>}

Dem Try-Schlüsselwort folgt eine Liste von Anweisungen in geschweiften Klammern. Tritt ein zum Abbruch führender Fehler auf, während die Anweisungen in der Anweisungsliste ausgeführt werden, übergibt das Skript das Fehlerobjekt aus dem Try-Block an einen entsprechenden Catch-Block.

Das folgende Beispiel zeigt die Syntax des Catch-Blocks:

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

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

Dem Catch-Schlüsselwort folgen eine optionale Liste von Fehlertypspezifikationen und eine Anweisungsliste. Wenn ein zum Abbruch führender Fehler im Try-Block auftritt, sucht Windows PowerShell nach einem entsprechenden Catch-Block. Wenn einer gefunden wird, werden die Anweisungen in dem 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 der Catch-Block diese Art von Fehler. Wenn einen Catch-Block keinen Fehlertyp angibt, behandelt der Catch-Block jeden Fehler, der im Try-Block gefunden wird. Eine Try-Anweisung kann mehrere Catch-Blöcke für die verschiedenen angegebenen Fehlertypen umfassen.

Das folgende Beispiel zeigt die Syntax des Finally-Blocks:

          finally {<statement list>}

Dem Finally-Schlüsselwort folgt eine Liste von Anweisungen, die bei jeder Ausführung des Skripts 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 dann nicht mehr als Ausgabe angezeigt. Daher wird, wenn Sie eine zur Anzeige vorgesehene Anweisung einschließen, wie z. B. „Finally-Block wurde ausgeführt“, diese Anweisung nicht mehr angezeigt, nachdem Sie STRG+C gedrückt haben, selbst 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 unmittelbar auf den Try-Block oder einen anderen Catch-Block folgen.

Windows PowerShell erkennt „NonsenseString“nicht als Cmdlet oder ein anderes Element. Beim Ausführen dieses Skripts wird das folgende Ergebnis zurückgegeben:

          An error occurred.

Wenn das Skript „NonsenseString“ findet, verursacht es einen zum Abbruch führenden Fehler. Der Catch-Block behandelt den Fehler durch Ausführen der Anweisungsliste innerhalb des Blocks.

VERWENDEN MEHRERER CATCH-ANWEISUNGEN

Eine Try-Anweisung kann eine beliebige Anzahl von Catch-Blöcken aufweisen. So enthält z. B. das folgende Skript einen Try-Block, der MyFile.doc herunterlädt, sowie zwei Catch-Blöcke:

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

Der erste Catch-Block behandelt Fehler vom Typ System.NET.WebException und System.IO.IOException. Der zweite Catch-Block gibt keinen Fehlertyp an. Der zweite Catch-Block behandelt alle anderen zum Abbruch führenden Fehler, die auftreten.

Windows PowerShell ermittelt die Übereinstimmung der Fehlertypen durch 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 Catch-Block, der einen Fehler vom Typ „Befehl nicht gefunden“ abfängt:

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

Der angegebenen Fehlertyp, CommandNotFoundException, wird dabei vom System.SystemException-Typ geerbt. Das folgende Beispiel fängt auch einen „Befehl nicht gefunden“-Fehler ab:

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

Dieser Catch-Block behandelt den Fehlertyp „Befehl nicht gefunden“ und andere Fehler, die vom SystemException-Typ geerbt werden.

Wenn Sie eine Fehlerklasse und eine der daraus abgeleiteten Klassen angeben, müssen Sie den Catch-Block für die abgeleitete Klasse vor dem Catch-Block für die allgemeine Klasse platzieren.

FREIGEBEN VON RESSOURCEN MIT FINALLY

Um von einem Skript verwendete Ressourcen freizugeben, fügen Sie nach den Try- und Catch-Blöcken einen Finally-Block hinzu. Die Anweisungen des Finally-Blocks werden unabhängig davon ausgeführt, ob der Try-Block, einen zu einem Abbruch führenden Fehler findet oder nicht. Windows PowerShell führt den Finally-Block aus, bevor das Skript beendet wird oder bevor der aktuelle Block den Gültigkeitsbereich verlässt.

Ein Finally-Block wird sogar ausgeführt, wenn Sie STRG+C verwenden, um das Skript zu beenden. Ein Finally-Block wird ebenfalls ausgeführt, wenn das Skript durch ein Exit-Schlüsselwort aus einem Catch-Block heraus beendet wird.

SIEHE AUCH

about_Break

about_Continue

about_Scopes

about_Throw

about_Trap