| | 0

PowerShell: Sprachkonstrukte (Trap Anweisung, Throw Anweisung) – Part 17.7

4.4.10    Trap Anweisung

Mit der Trap Anweisung werden sogenannte Exceptions (oder Terminating Errors) behandelt. Die Syntax lautet wie folgt:

Trap                     Trap Schlüsselwort
[<ExceptionType>]        Optional, Fehlertyp
{    
<StatementList>          Anweisungsblock
[Breack|Continue]        Optional, Schlüsselworte zur Flusssteuerung
}    

Wenn eine Exception auftritt, ist das, was danach passiert, abhängig von einigen Systemvariablen. Die Variable $ErrorActionPreference entscheidet darüber, ob die Ausführung fortgesetzt wird, während eine Fehlermeldung angezeigt wird ($ErrorActionPreference = Continue) oder keine Fehlermeldung angezeigt wird ($ErrorActionPreference = SilentlyContinue). Ist der Wert hingegen „Stop“ wird die Ausführung unterbrochen. Zusätzlich zu den globalen Variablen kann bei jedem CMDLet, welches die sogenannten „Common Parameters“ unterstützt, der Parameter –ErrorAction mit einem entsprechenden Wert angegeben werden. Mit der Trap Anweisung kann auf bestimmte Exceptions reagiert werden. Wenn im Code hinter der Trap Anweisung eine Exception auftritt, wird der Anweisungsblock der Trap Anweisung ausgeführt. Beinhaltet der Anweisungsblock das Schlüsselwort Break, wird die Ausführung unterbrochen und die Fehlermeldung ausgegeben. Wird dagegen das Schlüsselwort Continue verwendet, wird keine Fehlermeldung ausgegeben. In allen Fällen, außer wenn die Break Anweisung verwendet wird, wird die Ausführung des Codes bei der nächsten Anweisung fortgesetzt, in dem Scope, wo sich die Trap Anweisung befindet und nicht unbedingt mit der Anweisung, welche auf diese folgt, in der die Exception aufgetreten ist. Beispiele:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1.  .{
2.  >> Trap {Write-Host "Trap commands"}
3.  >> 1
4.  >> 2
5.  >> 1/$null
6.  >> 3
7.  >> 4
8.  >> }
9.  >>
1
2
Trap commands
Attempted to divide by zero.
At line:5 char:3
+ 1/ <<<< $null
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException
3
4

Dieses Beispiel stellt die einfachste Form der Trap Anweisung dar. An der Stelle, wo die Exception auftritt (hier: 1/$null – Division durch Null), wird der Anweisungsblock der Trap Anweisung ausgeführt, dann die Fehlermeldung ausgegeben und anschließend folgt die Ausführung mit der nächsten Anweisung hinter der Exception.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1.  .{
2.  >> Trap {Write-Host "Trap commands";break}
3.  >> 1
4.  >> 2
5.  >> 1/$null
6.  >> 3
7.  >> 4
8.  >> }
9.  >>
1
2
Trap commands
Attempted to divide by zero.
At line:5 char:3
+ 1/ <<<< $null
    + CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : RuntimeException

Der einzige Unterschied in diesem Beispiel besteht darin, dass im Anweisungsblock der Trap Anweisung noch das Schlüsselwort Break verwendet wird. Tritt die Exception auf, wird nach der Ausführung des Anweisungsblocks der Trap Anweisung die gesamte Ausführung unterbrochen.

1
2
3
4
5
6
7
8
9
10
11
12
13
1.  PS X:\Temp> .{Trap {Write-Host "Trap commands";continue}
2.  >> 1
3.  >> 2
4.  >> 1/$null
5.  >> 3
6.  >> 4
7.  >> }
8.  >>
1
2
Trap commands
3
4

In diesem Beispiel wird das Schlüsselwort Continue verwendet. Die Ausgabe ist mit der des ersten Beispiels identisch, bis auf die Ausgabe der Fehlermeldung.

1
2
3
4
5
6
1.  .{
2.  >> trap [System.Management.Automation.CommandNotFoundException] {"Error found: " + $_.FullyQualifiedErrorId;continue}
3.  >> abc123.df
4.  >> }
5.  >>
Error found: CommandNotFoundException

Bisher war die Trap Anweisung bei jeder Exception aktiv. In diesem Beispiel wird jedoch der Fehlertyp angegeben, so dass die Trap Anweisung nur dann ausgeführt wird, wenn eine entsprechende Exception auftritt. Solange es kein Kommando oder eine Executable mit dem Namen „abc123.df“ gibt, tritt die CommandNotFoundException auf und die Trap Anweisung wird aktiv.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1.  PS X:\Temp> .{
2.  >> Function Throw-Exception
3.  >> {
4.  >> 11
5.  >> 12
6.  >> 1/$null
7.  >> 13
8.  >> 14
9.  >> }
10. >>
11. >> Trap {Write-Host "Trap commands";continue}
12. >> 1
13. >> 2
14. >> Throw-Exception
15. >> 3
16. >> 4
17. >> }
18. >>
1
2
11
12
Trap commands
3
4

Dieses Beispiel illustriert das Verhalten der Trap Anweisung bei mehreren Scopes. Der zweite Scope wird hier mit Hilfe einer Funktion realisiert. Die Trap Anweisung befindet sich außerhalb der Funktion, so dass – wenn die Exception (1/$null innerhalb der Funktion) auftritt – der Anweisungsblock der Trap Anweisung ausgeführt wird, aber die Fortsetzung läuft nicht mehr innerhalb der Funktion (fehlende Ausgabe von 13 und 14), sondern mit dem nächsten Befehl des übergeordneten Scopes (die Ausgabe von 3 und 4).

4.4.11 Throw Anweisung

Die Throw Anweisung erzeugt einen Laufzeitfehler.

Throw                    Throw Schlüsselwort
 {    
<Expression>     Auszugebende Meldung
}    

In den Beispielen zur Trap Anweisung könnte also an Stelle von 1/$null einfach eine Throw Anweisung verwendet werden. In der ersten Version von PowerShell hatte die Throw Anweisung eine konkrete und wichtige Verwendung:

1.  Function Throw-Example ($Name = $(Throw "A name must be given"))
2.  >> {}
3.  >>
4.  Throw-Example
A name must be given
At line:1 char:40
+ Function Throw-Example ($Name = $(Throw <<<<  "A name must be given"))
    + CategoryInfo          : OperationStopped: (A name must be given:String) [], RuntimeException
    + FullyQualifiedErrorId : A name must be given

In diesem Beispiel wird der Funktionsparameter $Name zu einem mandatory Parameter. In der Version 2.0 der PowerShell erübrigt sich die Verwendung von Throw zu diesem Zweck, da diesbezüglich entsprechende Optionen und Erweiterungen implementiert wurden (siehe Kapitel 4.1.5).

Eine Übersicht aller Artikel dieser Windows PowerShell Blogserie findet ihr hier.

Zurück zu Part 17.6 – Sprachkonstrukte (Switch Anweisung)

Weiter zu Part 17.8 – Sprachkonstrukte (Try, Catch, Finally)