Powershell erreur

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Gestion des erreurs PowerShell
Variable clé $ErrorActionPreference
Mécanismes try/catch/finally, trap, throw
Voir aussi Set-PSDebug · Trace-command

PowerShell distingue les erreurs critiques (terminating, qui arrêtent l'exécution) des erreurs non critiques (non-terminating, qui laissent le script continuer). Le comportement se règle globalement via $ErrorActionPreference ou sélectivement via le paramètre commun -ErrorAction.

Préférence globale

La variable $ErrorActionPreference accepte les valeurs suivantes :

$ErrorActionPreference = 'SilentlyContinue'   # ignore l'erreur et continue
$ErrorActionPreference = 'Continue'           # affiche l'erreur et continue (défaut)
$ErrorActionPreference = 'Stop'               # transforme en erreur critique
$ErrorActionPreference = 'Inquire'            # demande à l'utilisateur

Paramètres communs

-ErrorAction    (SilentlyContinue | Continue | Inquire | Stop)
-ErrorVariable  <nom de variable>
-Debug          {$true | $false}
-Verbose        {$true | $false}
-OutVariable    <nom de variable>
-OutBuffer      <int32>
Get-ChildItem "c:\" -ErrorAction SilentlyContinue
Get-ChildItem "c:\" -ErrorAction Inquire

# On retrouve le message d'erreur avec :
$Error[0]

# Capturer les erreurs dans une variable dédiée
Get-ChildItem "c:\" -ErrorVariable MaVar
$MaVar | Get-Member -Force

Récupérer une erreur non critique

& {
    $ErrorActionPreference = 'SilentlyContinue'
    [int]$i = 'ABC'   # source de l'erreur

    if ($?) {
        Write-Host 'Tout est ok'
    }
    else {
        Write-Host "Une erreur est survenue : $($Error[0].Exception.Message)"
    }
    Write-Host 'Suite du script'
}

Deux variables automatiques utiles :

$?             # $true si la dernière opération a réussi
$LastExitCode  # code de retour du dernier programme externe

Récupérer une erreur critique (trap)

& {
    $ErrorActionPreference = 'Continue'
    for ($i = -2; $i -le 2; $i++) {
        trap { 'Erreur critique détectée !'; break }
        100 / $i
    }
    Write-Host 'suite...'
}

Un trap peut être défini dans l'étendue parent et dans l'étendue enfant :

& {
    $ErrorActionPreference = 'Continue'
    trap { "Exception détectée dans l'étendue parent !"; break }
    for ($i = -2; $i -le 2; $i++) {
        trap { "Exception détectée dans l'étendue enfant !"; break }
        100 / $i
    }
    Write-Host 'suite...'
}

throw

& {
    $ErrorActionPreference = 'Continue'
    trap { 'Exception détectée : ' + $_ }
    throw 'Ma première exception personnalisée !'
}

throw sert aussi à rendre un paramètre obligatoire :

function Bonjour ($prenom = $(throw 'Il manque le paramètre -Prenom')) {
    Write-Host "Bonjour $prenom" -ForegroundColor Green
}

try / catch / finally

try     { <bloc instructions> }
catch [<type d'erreur>] { <bloc instructions> }
finally { <bloc instructions> }
function Boucle {
    for ($i = -2; $i -le 2; $i++) {
        try   { 100 / $i }
        catch { Write-Host 'Erreur dans le script !' }
    }
}

Débogage

$DebugPreference = 'Continue'
$DebugPreference = 'Stop'

Voir aussi Set-PSDebug.

Voir aussi