THEMA about_Try_Catch_Finally KURZBESCHREIBUNG Beschreibt die Verwendung von Try-, Catch- und Finally-Blöcken zum Behandeln von Fehlern mit Abbruch. DETAILBESCHREIBUNG Mit Try-, Catch- und Finally-Blöcken können Sie auf Fehler mit Abbruch in Skripts reagieren oder diese behandeln. Die Trap-Anweisung kann ebenfalls verwendet werden, um Fehler mit Abbruch in Skripts zu behandeln. Weitere Informationen finden Sie unter "about_Trap". Bei einem Fehler mit Abbruch wird die Ausführung einer Anweisung verhindert. Wenn in Windows PowerShell ein Fehler mit Abbruch nicht behandelt wird, wird auch die Funktion oder das Skript in der aktuellen Pipeline nicht mehr ausgeführt. In anderen Programmiersprach en, z. B. C#, werden Fehler mit Abbruch als Ausnahmen bezeichnet. Weitere Informationen zu Fehlern finden Sie unter "about_Errors". Definieren Sie mit dem Try-Block einen Abschnitt eines Skripts, in dem Windows PowerShell Fehler überwachen soll. Wenn im Try-Blocks ein Fehler auftritt, wird der Fehler zunächst in der automatischen Variablen "$Error"gespeichert. Windows PowerShell sucht dann nach einem Catch-Block, um den Fehler zu behandeln. Wenn die Try-Anweisung über keinen entsprechenden Catch-Block verfügt, sucht Windows PowerShell in den übergeordneten Bereichen nach einem geeigneten Catch-Block oder einer Trap-Anweisung. Wenn ein Catch-Block abgeschlossen wurde bzw. kein entsprechender Catch-Block oder keine entsprechende Trap-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 Skriptflusses enthalten. In einem Catch-Block kann angegeben sein, welche Fehlertypen abgefangen werden. Eine Try-Anweisung kann mehrere Catch-Blöcke für unterschiedliche Arten von Fehlern enthalten. Mit einem Finally-Block können beliebige Ressourcen freigegeben werden, die vom Skript nicht mehr benötigt werden. Try, Catch und Finally ähneln den Schlüsselwörtern Try, Catch und Finally, die in der Programmiersprache C# verwendet werden. Syntax Eine Try-Anweisung enthält einen Try-Block, 0 oder mehr Catch-Blöcke und 0 oder einen Finally-Block. Eine Try-Anweisung muss mindestens einen Catch-Block oder einen Finally-Block enthalten. Im Folgenden finden Sie die Syntax für Try-Blöcke: try {<Anweisungsliste>} Dem Try-Schlüsselwort folgt eine Anweisungsliste in geschweiften Klammern. Bei einem Fehler mit Abbruch während der Ausführung der Anweisungen in der Anweisungsliste übergibt das Skript das Fehlerobjekt vom Try-Block an einen entsprechenden Catch-Block. Im Folgenden finden Sie die Syntax für Catch-Blöcke: catch [[<Fehlertyp>][]] {<Anweisungsliste>} Fehlertypen werden in Klammern angezeigt. Die äußersten Klammern kennzeichnen optionale Elemente. Dem Catch-Schlüsselwort folgen eine optionale Liste von Fehlertypspezifikationen und eine Anweisungsliste. Bei einem Fehler mit Abbruch im Try-Block sucht Windows PowerShell nach einem entsprechenden Catch-Block. Wenn ein Catch-Block gefunden wird, werden die darin enthaltenen Anweisungen ausgeführt. Im Catch-Block können ein oder mehrere Fehlertypen angegeben werden. Ein Fehlertyp ist eine Microsoft .NET Framework-Ausnahme oder eine Ausnahme, die von einer .NET Framework-Ausnahme abgeleitet wird. In einem Catch-Block werden Fehler der angegebenen .NET Framework-Ausnahmeklasse oder einer beliebigen Klasse behandelt, die von der angegebenen Klasse abgeleitet wird. Wenn in einem Catch-Block ein Fehlertyp angegeben wird, behandelt dieser Catch-Block diesen Fehlertyp. Wenn in einem Catch-Block kein Fehlertyp angegeben wird, behandelt dieser Catch-Block jeden im Try-Block aufgetretenen Fehler. Eine Try-Anweisung kann mehrere Catch-Blöcke für die anderen angegebenen Fehlertypen enthalten. Im Folgenden finden Sie die Syntax für Finally-Blöcke: finally {<Anweisungsliste>} Dem Finally-Schlüsselwort folgt eine Anweisungsliste, die bei jeder Skriptausführung ausgeführt wird, auch wenn die Try-Anweisung ohne Fehler ausgeführt oder in einer catch-Anweisung ein Fehler abgefangen wurde. Wenn Sie STRG+C drücken, wird die Pipeline beendet. An die Pipeline gesendete Objekte werden nicht als Ausgabe angezeigt. Wenn Sie eine anzuzeigende Anweisung einschließen, z. B. "Finally-Block wurde ausgeführt", wird diese daher nicht angezeigt, wenn Sie STRG+C gedrückt haben. Dies gilt auch dann, wenn der Finally-Block ausgeführt wurde. Abfangen von Fehlern Das folgende Beispielskript zeigt einen Try-Block mit einem Catch-Block: try { NonsenseString } catch { "Fehler." } Das Catch-Schlüsselwort muss dem Try-Block oder einem anderen Catch-Block unmittelbar folgen. Windows PowerShell erkennt "NonsenseString" nicht als Cmdlet oder anderes Element. Dieses Skript gibt folgendes Ergebnis zurück: Fehler. Wenn das Skript "NonsenseString" findet, wird ein Fehler mit Abbruch verursacht. Der Catch-Block behandelt den Fehler durch Ausführen der Anweisungsliste im Block. Verwenden mehrerer catch-Anweisungen Eine Try-Anweisung kann einer beliebige Anzahl von Catch-Blöcken enthalten. Das folgende Skript enthält beispielsweise einen Try-Block, mit dem "MeineDatei.doc" heruntergeladen wird, sowie zwei Catch-Blöcke: try { $wc = new-object System.Net.WebClient $wc.DownloadFile("http://www.contoso.com/MeineDatei.doc") } catch [System.Net.WebException],[System.IO.IOException] { "'MeineDatei.doc' kann nicht von 'http://www.contoso.com' heruntergeladen werden." } catch { "Ein Fehler ist aufgetreten, der nicht aufgelöst werden konnte". } Der erste Catch-Block behandelt Fehler des System.Net.WebException- Typs und des System.IO.IOException-Typs. Der zweite Catch-Block gibt keinen Fehlertyp an. Der zweite Catch-Block behandelt alle anderen aufgetretenen Fehler mit Abbruch. Windows PowerShell vergleicht Fehlertypen durch Vererbung. In einem Catch-Block werden Fehler der angegebenen .NET Framework- Ausnahmeklasse oder einer beliebigen Klasse behandelt, die von der angegebenen Klasse abgeleitet wird. Das folgende Beispiel enthält einen Catch-Block, mit dem der Fehler "Befehl nicht gefunden" abgefangen wird: catch [System.Management.Automation.CommandNotFoundException] {"Geerbte Ausnahme" } Der angegebene Fehlertyp, CommandNotFoundException, erbt vom System.SystemException-Typ. Im folgenden Beispiel wird auch der Fehler "Befehl nicht gefunden" abgefangen: catch [System.SystemException] {"Einfache Ausnahme" } Dieser Catch-Block behandelt den Fehler "Befehl nicht gefunden" sowie andere Fehler, die vom SystemException-Typ geerbt werden. Wenn Sie eine Fehlerklasse und eine von deren abgeleiteten Klassen angeben, platzieren Sie den Catch-Block für die abgeleitete Klasse vor dem Catch-Block für die allgemeine Klasse. Freigeben von Ressourcen mit Finally Um von einem Skript verwendete Ressourcen freizugeben, fügen Sie nach dem Try-Block und den Catch-Blöcken einen Finally-Block hinzu. Die Anweisungen des Finally-Blocks werden unabhängig davon ausgeführt, ob im Try-Block ein Fehler mit Abbruch auftritt. Windows PowerShell führt den Finally-Block aus, bevor das Skript beendet wird oder der aktuelle Block den Bereich verlässt. Ein Finally-Block wird auch dann ausgeführt, wenn Sie das Skript mit STRG+C beenden. Ein Finally-Block wird auch dann ausgeführt, wenn das Skript durch ein Exit-Schlüsselwort in einem Catch-Block beendet wird. SIEHE AUCH about_Errors about_Trap