THEMA
about_Trap
KURZBESCHREIBUNG
Beschreibt ein Schlüsselwort, das einen Fehler mit Abbruch behandelt.
DETAILBESCHREIBUNG
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
Programmiersprachen, z. B. C#, werden Fehler mit Abbruch als
Ausnahmen bezeichnet.
Das Trap-Schlüsselwort gibt eine Liste von Anweisungen an,
die bei einem Fehler mit Abbruch ausgeführt werden. Mit
Trap-Anweisungen werden Fehler mit Abbruch behandelt. Sie
ermöglichen die fortgesetzte Ausführung des Skripts oder
der Funktion.
Syntax
Für Trap-Anweisungen wird die folgende Syntax verwendet:
trap [[<Fehlertyp>]] {<Anweisungsliste>}
Die Trap-Anweisung enthält eine Liste von Anweisungen, die bei
einem Fehler mit Abbruch ausgeführt werden. Das Trap-Schlüssel-
wort kann optional einen Fehlertyp angeben. Für einen Fehlertyp
sind Klammern erforderlich.
Ein Skript oder ein Befehl kann mehrere Trap-Anweisungen
aufweisen. Trap-Anweisungen können an jeder Stelle im Skript
oder Befehl enthalten sein.
Abfangen aller Fehler mit Abbruch
Bei einem Fehler mit Abbruch, der nicht auf andere Weise in
einem Skript oder einem Befehl behandelt wird, überprüft
Windows PowerShell das Vorhandensein einer Trap-Anweisung für
die Fehlerbehandlung. Wenn eine Trap-Anweisung vorhanden ist,
führt Windows PowerShell das Skript oder den Befehl in der
Trap-Anweisung weiterhin aus.
Das folgende Beispiel stellt eine sehr einfache Trap-Anweisung dar:
trap {"Fehler gefunden."}
Diese Trap-Anweisung fängt jeden Fehler mit Abbruch auf. Das
folgende Beispiel zeigt eine Funktion, die diese Trap-Anweisung
enthält:
function TrapTest {
trap {"Fehler gefunden."}
nonsenseString
}
Diese Funktion enthält eine unsinnige Zeichenfolge, die zu
einem Fehler führt. Wenn diese Funktion ausgeführt wird, gibt
sie Folgendes zurück:
C:\PS> TrapTest
Fehler gefunden.
Das folgende Beispiel enthält eine Trap-Anweisung, mit der der
Fehler in der automatischen Variablen "$_" angezeigt wird:
function TrapTest {
trap {"Fehler gefunden: $_"}
nonsenseString
}
Wenn Sie diese Version der Funktion ausführen, gibt sie
Folgendes zurück:
C:\PS> TrapTest
Fehler gefunden: Der Begriff 'nonsenseString' wird nicht
als Name eines Cmdlet, einer Funktion, einer Skriptdatei
oder eines ausführbaren Programms erkannt. Überprüfen Sie
die Schreibung des Namens, oder, wenn ein Pfad
eingeschlossen ist, überprüfen Sie die Richtigkeit des
Pfads, und wiederholen Sie dann den Vorgang.
Trap-Anweisungen können auch komplexer sein. Trap-Anweisungen
können mehrere Bedingungen oder Funktionsaufrufe einschließen.
Andere Programme können damit protokolliert, getestet und sogar
ausgeführt werden.
Abfangen angegebener Fehler mit Abbruch
Das folgende Beispiel zeigt eine Trap-Anweisung, mit der der
CommandNotFoundException-Fehlertyp abgefangen wird:
trap [System.Management.Automation.CommandNotFoundException]
{"Fehler im Befehl abgefangen"}
Wenn eine Funktion oder ein Skript eine Zeichenfolge findet,
die mit keinem bekannten Befehl übereinstimmt, zeigt diese
Trap-Anweisung die Zeichenfolge "Fehler im Befehl abgefangen".
Wenn Anweisungen in der Trap-Anweisungsliste ausgeführt wurden,
wird von Windows PowerShell das Fehlerobjekt in den
Fehlerstream geschrieben und das Skript dann fortgesetzt.
Windows PowerShell verwendet die Microsoft .NET Framework-Aus-
nahmetypen. Im folgenden Beispiel wird der Fehlertyp
System.Exception angegeben:
trap [System.Exception] {"Fehler abgefangen"}
Der CommandNotFoundException-Fehlertyp erbt vom Typ
"System.Exception". Von der Anweisung wird ein von einem
unbekannten Befehl erstellter Fehler abgefangen. Auch andere
Fehlertypen werden abgefangen.
Sie können mehrere Trap-Anweisungen in einem Skript haben.
Jeder Fehler kann von nur einer Trap-Anweisung abgefangen
werden. Wenn bei einem Fehler mehrere Trap-Anweisungen
verfügbar sind, verwendet Windows PowerShell die Trap-Anweisung
mit dem spezifischsten Fehlertyp, der mit dem Fehler übereinstimmt.
Das folgende Skriptbeispiel enthält einen Fehler. Das Skript
enthält eine allgemeine Trap-Anweisung, mit der jeder Fehler
mit Abbruch abgefangen wird, sowie eine spezifische
Trap-Anweisung, mit der der CommandNotFoundException-Typ
angegeben wird.
trap {"Anderen Fehler mit Abbruch abgefangen" } trap
[System.Management.Automation.CommandNotFoundException] {"Fehler im Befehl abgefangen"}
nonsenseString
Dieses Skript führt zum folgenden Ergebnis:
Fehler im Befehl abgefangen
Der Begriff 'nonsenseString' wird nicht als Name eines
Cmdlet, einer Funktion, einer Skriptdatei oder eines
ausführbaren Programms erkannt. Überprüfen Sie die
Schreibung des Namens, oder, wenn ein Pfad eingeschlossen
ist, überprüfen Sie die Richtigkeit des Pfads, und
wiederholen Sie dann den Vorgang.
At C:\PS>testScript1.ps1:3 char:19
+ nonsenseString <<<<
Da Windows PowerShell "nonsenseString" nicht als Cmdlet oder
anderes Element erkennt, wird ein CommandNotFoundException-
Fehler zurückgegeben. Dieser Fehler mit Abbruch wird von der
spezifischen Trap-Anweisung abgefangen.
Das folgende Skriptbeispiel enthält die gleichen Trap-
Anweisungen mit einem anderen Fehler:
trap {"Anderen Fehler mit Abbruch abgefangen" }
trap [System.Management.Automation.CommandNotFoundException]
{"Fehler im Befehl abgefangen"}
1/$null
Dieses Skript führt zum folgenden Ergebnis:
Anderen Fehler mit Abbruch abgefangen
Versucht, durch 0 zu dividieren.
At C:PS> errorX.ps1:3 char:7
+ 1/ <<<< $null
Beim Versuch, durch 0 zu dividieren, wird kein CommandNotFound
Exception-Fehler ausgegeben. Stattdessen wird dieser Fehler von
der anderen Trap-Anweisung abgefangen, die jeden Fehler mit
Abbruch abfängt.
Abfangen von Fehlern und Bereiche
Wenn ein Fehler mit Abbruch im gleichen Bereich wie die
Trap-Anweisung auftritt, setzt Windows PowerShell nach dem
Ausführen der Trap-Anweisungen den Vorgang mit der Anweisung
nach dem Fehler fort. Wenn sich die Trap-Anweisung in einem
anderen Bereich als der Fehler befindet, wird die Ausführung
mit der nächsten Anweisung fortgesetzt, die sich im gleichen
Bereich wie die Trap-Anweisung befindet.
Wenn beispielsweise in einer Funktion ein Fehler auftritt und
die Trap-Anweisung in der Funktion enthalten ist, wird das
Skript mit der nächsten Anweisung fortgesetzt. Das folgende
Skript enthält z. B. einen Fehler und eine Trap-Anweisung:
function function1 {
trap { "Fehler: " }
NonsenseString
"function1 wurde abgeschlossen"
}
Weiter unten im Skript führt die Ausführung der Funktion
"Function1" zum folgenden Ergebnis:
function1
Fehler:
Der Begriff 'NonsenseString' wird nicht als Name eines
Cmdlet, einer Funktion, einer Skriptdatei oder eines
ausführbaren Programms erkannt. Überprüfen Sie die
Schreibung des Namens, oder, wenn ein Pfad eingeschlossen
ist, überprüfen Sie die Richtigkeit des Pfads, und
wiederholen Sie dann den Vorgang.
At C:\PS>TestScript1.ps1:3 char:19
+ NonsenseString <<<<
function1 wurde abgeschlossen
Die Trap-Anweisung in der Funktion fängt den Fehler auf. Wenn
die Meldung angezeigt wurde, setzt Windows PowerShell die
Ausführung der Funktion fort. Beachten Sie, dass Function1
abgeschlossen wurde.
Vergleichen Sie dies mit dem folgenden Beispiel, das den
gleichen Fehler und die gleiche Trap-Anweisung enthält. In
diesem Beispiel befindet sich die Trap-Anweisung außerhalb der
Funktion:
function function2 {
NonsenseString
"function2 wurde abgeschlossen"
}
trap { "Fehler: " }
. . .
function2
Weiter unten im Skript führt die Ausführung der Funktion
"Function2" zum folgenden Ergebnis:
Fehler:
Der Begriff 'NonsenseString' wird nicht als Name eines
Cmdlet, einer Funktion, einer Skriptdatei oder eines
ausführbaren Programms erkannt. Überprüfen Sie die
Schreibung des Namens, oder, wenn ein Pfad eingeschlossen
ist, überprüfen Sie die Richtigkeit des Pfads, und
wiederholen Sie dann den Vorgang.
At C:\PS>TestScript2.ps1:4 char:19
+ NonsenseString <<<<
In diesem Beispiel wurde der Befehl "function2 wurde
abgeschlossen" nicht ausgeführt. Wenn sich die Trap-Anweisung
außerhalb der Funktion befindet, liegen zwar beide Fehler mit
Abbruch innerhalb einer Funktion vor, doch wechselt Windows
PowerShell nach dem Ausführen der Trap-Anweisung nicht zur
Funktion zurück.
Verwenden des Break-Schlüsselworts und des Continue-Schlüsselworts
Mit dem Break-Schlüsselwort und dem Continue-Schlüsselwort in
einer Trap-Anweisung können Sie bestimmen, ob ein Skript oder
ein Befehl nach einem Fehler mit Abbruch weiterhin ausgeführt
werden soll.
Wenn Sie eine Break-Anweisung in eine Trap-Anweisung-Liste
einschließen, wird die Funktion oder das Skript von Windows
PowerShell beendet. In der folgenden Beispielfunktion wird das
Break-Schlüsselwort in einer Trap-Anweisung verwendet:
C:\PS> function break_example {
trap {"Fehler abgefangen"; break;}
1/$null
"Funktion abgeschlossen."
}
C:\PS> break_example
Fehler abgefangen
Versucht, durch 0 zu dividieren.
Bei Zeile:4 Zeichen:7
Da die Trap-Anweisung das Break-Schlüsselwort enthält, wird die
Funktion nicht weiter ausgeführt, und die Zeile "Funktion
abgeschlossen" wird nicht ausgeführt.
Wenn Sie in eine Trap-Anweisung die Continue-Anweisung
einfügen, wird Windows PowerShell nach der Anweisung
fortgesetzt, die den Fehler verursacht hat, als ob Break oder
Continue nicht vorhanden wären. Bei Verwendung des
Continue-Schlüsselworts wird von Windows PowerShell jedoch kein
Fehler in den Fehlerstream geschrieben.
In der folgenden Beispielfunktion wird das Continue-Schlüssel-
wort in einer Trap-Anweisung verwendet:
C:\PS> function continue_example {
trap {"Fehler abgefangen"; continue;}
1/$null
"Funktion abgeschlossen."}
C:\PS> continue_example
Fehler abgefangen
Funktion abgeschlossen.
Die Funktion wird fortgesetzt, nachdem der Fehler abgefangen
wurde, und die Anweisung "Funktion abgeschlossen" wird
ausgeführt. In den Fehlerstream wird kein Fehler geschrieben.
SIEHE AUCH
about_Break
about_Continue
about_Throw
about_Try_Catch_Finally
about_Scopes