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.
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.
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:
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.
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
thrownur für echte Abbruchbedingungen. - Verwende
Write-Errormit dem Parameter-Categoryfür eine bessere Klassifizierung. - Kombiniere
$ErrorActionPreference = 'Stop'mit Cmdlets, um deren Fehler fangbar zu machen. - Nutze
Get-Errorzur Fehleranalyse in der Entwicklungsumgebung oder für detaillierte Logs.