Quand dois-je utiliser Write-Error par rapport a Throw ? Erreurs terminantes et non terminantes

ForumBot
Messages : 26117
Inscription : mer. avr. 22, 2026 5:33 pm

Quand dois-je utiliser Write-Error par rapport a Throw ? Erreurs terminantes et non terminantes

Message par ForumBot »

Quand dois-je utiliser Write-Error par rapport a Throw ? Erreurs terminantes et non terminantes

ayi
Site Admin
Messages : 13176
Inscription : mer. avr. 22, 2026 5:21 pm

Re: Quand dois-je utiliser Write-Error par rapport a Throw ? Erreurs terminantes et non terminantes

Message par ayi »

Write-Error doit etre utilise si vous souhaitez informer l’utilisateur d’une erreur non critique. Par defaut, il ne fait qu’afficher un message d’erreur en texte rouge dans la console. Il n’arrete pas un pipeline ou une boucle. Throw, en revanche, produit ce qu’on appelle une erreur terminante. Si vous utilisez throw, le pipeline et/ou la boucle en cours seront termines. En fait, toute l’execution sera terminee a moins que vous n’utilisiez une structure trap ou try/catch pour gerer l’erreur terminante.


Il y a une chose a noter : si vous definissez $ErrorActionPreference sur "Stop" et utilisez Write-Error, cela produira une erreur terminante.


Dans le script que vous avez mentionne, nous trouvons ceci :


if ($url.Contains("http")) {
$request = [System.Net.HttpWebRequest]::Create($url)
}
else {
$URL_Format_Error = [string]"Connection protocol not specified. Recommended action: Try again using protocol (for example 'http://" + $url + "') instead. Function aborting..."
Write-Error $URL_Format_Error
return
}


Il semble que l’auteur de cette fonction voulait arreter l’execution de cette fonction et afficher un message d’erreur a l’ecran, mais ne voulait pas que l’ensemble du script cesse de s’executer. L’auteur du script aurait pu utiliser throw, mais cela aurait signifie que vous auriez du utiliser un try/catch lors de l’appel de la fonction.


return quitte la portee actuelle, qui peut etre une fonction, un script ou un bloc de script. C’est mieux illustre avec du code :


# Une boucle foreach.
foreach ( $i in (1..10) ) { Write-Host $i ; if ($i -eq 5) { return } }

# Une boucle for.
for ($i = 1; $i -le 10; $i++) { Write-Host $i ; if ($i -eq 5) { return } }


Sortie pour les deux :


1
2
3
4
5


Un piege ici est l’utilisation de return avec ForEach-Object. Cela n’interrompra pas le traitement comme on pourrait s’y attendre.


Plus d’informations :



(Reponse tronquee)

Répondre

Revenir à « PowerShell »