Skip to the main content.

PowerShell-Erfolgsrezepte – die Profi-Tipps für effektives Scripting

Stelle Fehlern eine Falle! Mit der Trap-Anweisung Terminating Errors abfangen

Du bist mit try...catch vertraut? Exceptions kannst du mit Trap-Anweisungen behandeln. Kurz und knackig kommt hier der nächste Tipp von Aleksandar & Tobias:  

Nutze Trap-Anweisungen – so helfen sie dir

Die meisten fortgeschrittenen PowerShell-Nutzer sind mit der Try-Catch Fehlerbehandlung vertraut. Hier ist ein Beispiel:


try
{
    Write-Host 'Previous Command'
    $result = Get-ChildItem -Path $env:windir -Depth 1 -Filter *.log -ErrorAction Stop
    Write-Host 'Next Command'
}
catch
{
   $_.CategoryInfo | Select-Object -Property Category, TargetName  
}

 

Für die Verwendung von try...catch gelten einige Einschränkungen: 

  • Für try...catch muss das Cmdlet die Aufgabe *abbrechen*, um die Exception abzufangen (über -ErrorAction Stop oder wenn Terminating Error ausgegeben wird).
  • Jede Exception im Try-Block überspringt die restlichen Befehle in diesem Block. Die zweite Write-Host-Anweisung wird also nicht ausgeführt.

Diese Vorgehensweise kann erwünscht sein, und in diesem Fall ist try...catch die beste Wahl.

Wenn jedoch keine Befehle übersprungen werden sollen, kann stattdessen eine Trap-Anweisung verwendet werden (siehe unten). Und wenn du ein Cmdlet nicht abbrechen, sondern stattdessen Fehler auswerten möchtest, nachdem das Cmdlet abgeschlossen wurde, solltest du unseren nächsten Tipp in dieser Reihe lesen.

 

Eine Trap-Anweisung ist im Wesentlichen ein Catch-Block ohne einen Try-Block. Der obige Beispielcode kann leicht geändert werden:

das musst du ändern um aus try/catch eine Trap-Anweisung zu machen

Entferne das Schlüsselwort try und die {} Klammern und ersetze catch durch trap, füge continue hinzu und du erhältst:


Write-Host 'Previous Command'
$result = Get-ChildItem -Path $env:windir -Depth 1 -Filter *.log -ErrorAction Stop
Write-Host 'Next Command'

trap
{
   $_.CategoryInfo | Select-Object -Property Category, TargetName  
continue
}

 

Es gibt zwei Unterschiede: 

  • Da eine Trap-Anweisung eine globale Fehlerbehandlung ist, funktioniert sie überall in deinem Skript ohne einen try-Block. Jede Exception wird einzeln behandelt und kein Befehl wird übersprungen. Deshalb wird der zweite Write-Host-Befehl jetzt ausgeführt.
  • Da eine Trap-Anweisung den Fehler standardmäßig nicht behandelt, ist eine zusätzliche Continue-Anweisung erforderlich, wenn die Ausnahme behandelt werden soll. Ohne diese Anweisung würde die Exception an den nächsten Caller weitergereicht und schließlich würde eine rote Fehlermeldung auf der Konsole ausgegeben werden (zusätzlich zu dem, was in der Trap-Anweisung passiert). 

 

Good2know

Dein ultimatives PowerShell Cheat Sheet

Entfalte das volle Potential von PowerShell mit unserem praktischen Poster. Egal ob Anfänger oder erfahrener Profi, dieses Cheat Sheet ist darauf ausgelegt, dein Anlaufpunkt für die wichtigsten und am häufigsten verwendeten Cmdlets zu sein.

Zum Download oder ausgedruckt zum Aufhängen an deiner Wand.

PowerShell Poster 2023

Hol' dir das Poster!

 

 

Weiterführende Links 



Zusammenhängende Posts

3 min read

Skriptabbruch verhindern: PowerShell-Fehler clever behandeln

Da $error eine globale Variable ist, solltest du in Erwägung ziehen, eine eigene Protokollierungsvariable für die...

3 min read

Stelle Fehlern eine Falle! Mit der Trap-Anweisung Terminating Errors abfangen

Du bist mit try...catch vertraut? Exceptions kannst du mit Trap-Anweisungen behandeln. Kurz und knackig kommt hier der...

5 min read

Mehr Ordnung in PowerShell: lagere Konfigurationsdaten einfach aus

Verabschiede dich von fest codierten Pfaden und Einstellungen! Vereinfache deine PowerShell-Skripte, indem du...

Über den Autor: