about_Try_Catch_Finally
Letzte Aktualisierung: Juni 2009
Betrifft: Windows PowerShell 2.0
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("https://www.contoso.com/MeineDatei.doc")
}
catch [System.Net.WebException],[System.IO.IOException]
{
"'MeineDatei.doc' kann nicht von 'https://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