Melden von Fehlern in eigenen Skripten

Warum hat PowerShell drei verschiedene Mechanismen für Fehler? Das Ziel ist eine saubere Trennung zwischen "etwas läuft schief, aber wir können weitermachen" und "Stopp, hier geht gar nichts mehr!".

1. throw – Der Terminator

throw erzeugt einen Terminating Error. Das Skript bricht sofort ab, es sei denn, der Fehler wird von einem try/catch Block abgefangen.

PowerShell
try {
    if (-not (Test-Path "C:\important.txt")) {
        throw "Kritische Datei fehlt – Skript abgebrochen!"
    }
} catch {
    Write-Output "Abgefangen: $($_.Exception.Message)"
}

Wann nutzen: Bei Bedingungen, bei denen das Skript unmöglich fortgesetzt werden kann (z.B. fehlende Zugriffsrechte oder kritische Ressourcen).

2. Write-Error – Der Warner

Write-Error gibt eine Fehlermeldung aus, erzeugt aber standardmäßig einen Non-Terminating Error. Das Skript läuft danach einfach weiter.

PowerShell
Write-Error "Warnung: Backup fehlgeschlagen, aber Fortfahren möglich"
Write-Output "Skript läuft trotzdem weiter..."

Wann nutzen: Bei Fehlern, die informativ sind oder nur einen Teilschritt betreffen (z.B. eine von 100 Dateien konnte nicht kopiert werden).

Pro-Tipp: Nutze den Parameter -Category, um den Fehler für das Windows-Eventlog oder Monitoring-Systeme klassifizierbar zu machen:

PowerShell
Write-Error "Backup fehlgeschlagen" -Category ResourceUnavailable

3. Get-Error – Fehlerdetails auslesen

Ab PowerShell 7 bietet Get-Error eine sehr detailreiche Ansicht der letzten Fehler (aus der $Error -Variable) mit vollständigen Metadaten und Stacktrace.

PowerShell
Get-ChildItem "C:\GibtEsNicht"
Get-Error | Select-Object -First 1 | Format-List *

Wann nutzen: Für tiefgehendes Debugging oder Logging, wenn du genau wissen willst, in welcher Codezeile der Fehler entstanden ist.

Direkter Vergleich

Funktion Fehlerart Skript-Stopp try/catch-fähig In $Error
throw Terminating ✅ Ja ✅ Ja ✅ Ja
Write-Error Non-Terminating ❌ Nein ❌ Nein ✅ Ja
Get-Error Cmdlet - - Auslesen

Best Practices

  • Nutze throw nur für echte Abbruchbedingungen.
  • Verwende Write-Error mit dem Parameter -Category für eine bessere Klassifizierung.
  • Kombiniere $ErrorActionPreference = 'Stop' mit Cmdlets, um deren Fehler fangbar zu machen.
  • Nutze Get-Error zur Fehleranalyse in der Entwicklungsumgebung oder für detaillierte Logs.