HOWTO · PowerShell

Behandeln von Fehlern mit dem Try-Catch-Block in PowerShell

In diesem Artikel werden die Einstellungen für Fehleraktionen in PowerShell besprochen und wie wir sie abfangen können, um eine Fehlerbehandlung mit den PowerShell-Blöcken Try Catch und Finally durchzuführen.

Auf dieser Seite

In PowerShell behandeln try und catch Abbruchfehler. Viele Cmdlets melden Fehler als nicht terminierend, fügen Sie daher -ErrorAction Stop hinzu, wenn der Fehler eines Vorgangs einen catch-Block erreichen soll. $ErrorActionPreference legt die Standardbehandlung für nicht terminierende Fehler in seinem Gültigkeitsbereich fest, während -ErrorAction das Verhalten für einen einzelnen Befehl festlegt.

die $ErrorActionPreference-Variable in PowerShell

$ErrorActionPreference steuert, wie PowerShell in seinem Gültigkeitsbereich auf nicht terminierende Fehler reagiert. Der Standardwert ist Continue: PowerShell meldet den Fehler und fährt mit der nächsten Anweisung fort. Wird sie auf Stop gesetzt, werden nicht terminierende Fehler zu Abbruchfehlern hochgestuft, sodass sie den aktuellen Ablauf unterbrechen und von einem umgebenden catch behandelt werden können. Nachdem ein catch einen Fehler behandelt hat, folgt die Ausführung dem umgebenden Kontrollfluss; ein Fehler beendet nicht automatisch das gesamte Skript.

Verwenden Sie eine auf einen Bereich begrenzte Änderung, wenn nur ein Teil eines Skripts dieses Verhalten benötigt. Speichern Sie den alten Wert und stellen Sie ihn in einem finally-Block wieder her, wenn spätere Befehle die vorherige Einstellung verwenden sollen. Diese Einstellung gilt für Befehle, die PowerShells Einstellungen für Fehleraktionen beachten, und sie ersetzt nicht die explizite Behandlung jeder Fehlerart.

der gemeinsame Parameter ErrorAction in PowerShell

-ErrorAction ist ein gemeinsamer Parameter, der von vielen Cmdlets und Funktionen unterstützt wird. Sein Wert gilt für diesen Befehl und hat für diesen Aufruf Vorrang vor $ErrorActionPreference. Beispielsweise macht Get-Content $path -ErrorAction Stop einen nicht terminierenden Lesefehler für diesen Befehl zu einem Abbruchfehler. Ein umgebendes catch kann ihn dann behandeln. Der Parameter ändert, wie der Fehler des Befehls behandelt wird; die Wiederherstellungslogik gehört in das umgebende Skript.

Zu den Werten gehören Continue und Stop sowie, wo unterstützt, Aktionen wie SilentlyContinue, Ignore, Inquire und Suspend. Bevorzugen Sie -ErrorAction Stop bei dem Vorgang, dessen Fehler abgefangen werden soll, anstatt einen größeren Gültigkeitsbereich zu ändern. Befehle können auch unabhängig von dieser Einstellung Abbruchfehler erzeugen.

Verwenden Sie den PowerShell-Block try-catch

Platzieren Sie Anweisungen, die fehlschlagen können, in try. Ein Abbruchfehler überträgt die Steuerung an ein passendes catch; ein untypisiertes catch behandelt jeden Abbruchfehler, während eine typisierte Form wie catch [System.IO.IOException] Fehler dieses Typs behandelt. Platzieren Sie spezifische catches vor einem allgemeinen catch. $Error ist PowerShells automatische Sammlung des Fehlerverlaufs, nicht eine Variable, die nur den aktuellen Fehler darstellt. Innerhalb eines catch-Blocks beschreibt $_ (auch als $PSItem verfügbar) den aktuellen Fehlerdatensatz; seine Eigenschaften Exception oder FullyQualifiedErrorId können bei der Diagnose helfen.

Ein finally-Block ist optional und wird ausgeführt, wenn die Steuerung die try-Anweisung verlässt, unabhängig davon, ob sie normal abgeschlossen wurde oder ein Fehler behandelt wurde. Verwenden Sie ihn für Aufräumarbeiten, z. B. zum Freigeben einer Ressource, die vor dem Vorgang geöffnet wurde. Ein catch-Block kann einen Fehler wiederherstellen, protokollieren oder erneut werfen; ihn abzufangen entscheidet für sich allein nicht, ob das umgebende Skript seine verbleibende Arbeit fortsetzen soll.

Das folgende ausführbare Beispiel folgt dem Erfolgspfad und gibt eine Statuszeile vor seiner Aufräumzeile aus. Der Code hat keine externe Dateiabhängigkeit.

try {
    $reportName = "daily-report.txt"
    Write-Output "Prepared $reportName"
}
finally {
    Write-Output "Finished report step"
}
Prepared daily-report.txt
Finished report step

Fügen Sie für ein Cmdlet, dessen nicht terminierender Fehler abgefangen werden soll, -ErrorAction Stop zu diesem Cmdlet innerhalb von try hinzu. Halten Sie Pfade und andere Eingaben in Produktionsskripten explizit und wählen Sie dann je nach Vorgang, ob protokolliert, erneut versucht, wiederhergestellt oder erneut geworfen werden soll. Das Beispiel zeigt den Erfolgspfad; passen Sie dieselbe Kontrollflussstruktur um den Befehl an, dessen Fehler Sie behandeln müssen.