Zum Hauptinhalt springen

Behandelte und unbehandelte Fehler

Powershell kennt zwei Kategorien von Fehlern: terminierende und behandelte Fehler. Ein terminierender Fehler tritt unvermittelt auf. Powershell kann den Fehler nicht abfangen, wirft einen Fehler und beendet das Programm oder Skript, in dem der Fehler aufgetreten ist. Das muss nicht zwingend heißen, dass gleich Ihr ganzes Skript abbricht, aber zumindest der Befehl, der den Fehler verursacht hat, wird abgebrochen.

Ein behandelter Fehler ist ein Fehler, den der Programmierer vorhergesehen und für den er einen spezifischen Fehlerbehandlungscode geschrieben hat. Das Cmdlet kann beim Auftreten eines behandelten Fehlers eine Fehlermeldung anzeigen (was aber nicht passieren muss, prinzipiell kann ein behandelter Fehler auch völlig unbemerkt bleiben), läuft dann aber einfach weiter. Eine Zugriffsverweigerung von Get-Childitem ist z.B. ein behandelter Fehler.

 

Get-ChildItem -Path 'C:\Windows\CSC','C:\Windows\addins'
> Get-ChildItem : Der Zugriff auf den Pfad "C:\Windows\CSC" wurde verweigert.
Verzeichnis: C:\Windows\addins
Mode    LastWriteTime    Length Name
----    -------------    ------ ----
-a----  29.09.2017 15:43    802 FXSEXT.ecf

Im Beispiel werden zwei Ordner abgerufen, wobei der Zugriff auf C:\Windows\CSC\ einen Fehler wirft. Trotzdem wird das zweite Verzeichnis angezeigt. Wäre der Fehler unbehandelt gewesen, hätte Get-Childitem direkt nach dem Fehler abgebrochen und der  zweite Ordner wäre nicht angezeigt worden. Das kann man simulieren, denn man kann Powershell über den Parameter -Erroraction (oder kurz -EA) zwingen, alle Fehler wie unbehandelte Fehler zu verarbeiten.

Get-ChildItem -Path 'C:\Windows\CSC','C:\Windows\addins' -ErrorAction Stop
> Get-ChildItem : Der Zugriff auf den Pfad "C:\Windows\CSC" wurde verweigert.

In diesem Beispiel bricht die Verarbeitung nach dem Fehler sofort ab. Über -ErrorAction SilentlyContinue kann man die Fehlerausgabe auch unterdrücken. Der Parameter -Erroraction überschreibt für die Ausführung des jeweiligen Kommandos einfach die Einstellung der Standardvariable $Erroractionpreference, die in der Konsole festgelegt ist. Alle Einstellungen für $Erroraction finden Sie in der Tabelle ActionPreference-Einstellungen.