| | 0

PowerShell: Sprachkonstrukte (Try, Catch, Finally) – Part 17.8

4.4.12    Try, Catch, Finally

Try, Catch und Finally wurde in der PowerShell 2.0 implementiert und verhält sich ähnlich, wie das gleich benannte Konstrukt in C#. Damit kann eine sehr elegante Fehlerbehandlung in der Powershell realisiert werden. Die Syntax lautet wie folgt:

 

Try                                  Try Schlüsselwort
 {    
<StatementList>                      Anweisungsblock für Try
}    
Catch                                Catch Schlüsselwort
[[<Error-Type>][,<ErrorType>]*]      Optionale Fehlertypen
{    
<StatementList>                      Anweisungsblock für Catch
}    
Finally                              Finally Schlüsselwort
{    
<StatementList>                      Anweisungsblock für Finally

Der Catch-Block ist optional, es kann auch mehrere Catch-Blöcke geben. Der Finally-Block ist ebenfalls optional, es kann nur einen geben. Die Fehlerbehandlung funktioniert wie folgt:

  • Im Try-Block werden die Anweisungen platziert, welche einen Fehler (Terminating Error) verursachen können (z.B. Zugriff auf eine Webseite – die Internetverbindung kann unterbrochen sein, der Server kann offline sein, etc.)
  • Im Catch-Block erfolgt die Reaktion auf einen möglichen Fehler (im Anweisungsblock). Der Catch-Block wird auch nur dann ausgeführt, wenn ein Fehler aufgetreten ist. Wird im Catch-Block kein Fehlertyp aufgeführt, wird er bei allen Fehlern ausgeführt, die im Try-Block aufgetreten sind. Gibt es mehrere Catch-Blöcke mit spezifizierten Fehlertypen, wird derjenige ausgeführt, der als erster den aufgetretenen Fehlertyp abdeckt. Deshalb ist es bei mehreren Catch-Blöcken sinnvoll, die am meisten spezifischen zuerst im Code zu platzieren.
  • Der Finally-Block wird immer ausgeführt, unabhängig davon, ob ein Fehler aufgetreten ist oder nicht (es sei denn, Ctrl + C wird zwischendurch gedrückt). Der Finally-Block wird meist dazu verwendet, nicht mehr benötigte Objekte und Variablen zu entfernen.

Beispiel:  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1.  Try {
2.  >> $Winword = New-Object -ComObject Word.Application
3.  >> }
4.  >> Catch {
5.  >> Write-host "No Winword installed"
6.  >> }
7.  >> Finally {
8.  >> $Winword = $Null
9.  >> }
10. >>
11. Try {
12. >> $MyApp = New-Object -ComObject MyApp.Application
13. >> }
14. >> Catch {
15. >> Write-host "MyApp is not installed"
16. >> }
17. >> Finally {
18. >> $MyApp = $Null
19. >> }
20. >>
MyApp is not installed


Das erste Try-Konstrukt versucht ein neues COM-Objekt aus Winword zu erstellen. Da aber Winword auf dem Computer installiert ist und kein sonstiger Fehler auftritt, wird der Catch-Block gar nicht ausgeführt, dafür aber Finally. In dem zweiten Konstrukt wird das gleiche mit einer imaginären Applikation „MyApp“ versucht. Da sie aber nicht existiert, wird eine Exception erzeugt und somit auch der Catch-Block ausgeführt (Ausgabe in der letzten Zeile).

Natürlich ist das hier ein einfaches Beispiel. In Wirklichkeit würde der Try-Block noch mehr mit dem COM Objekt machen…

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

Zurück zu Part  17.7 – Sprachkonstrukte (Trap Anweisung, Throw Anweisung) 

Weiter zu Part 18 – Skriptblöcke