Write-Error
doit être utilisé si vous souhaitez informer l'utilisateur d'une erreur non critique. Par défaut, il ne fait qu'imprimer un message d'erreur en rouge sur la console. Elle n'empêche pas un pipeline ou une boucle de continuer. Throw
d'autre part, produit ce que l'on appelle une erreur de terminaison. Si vous utilisez throw, le pipeline et/ou la boucle en cours seront terminés. En fait, toute l'exécution sera interrompue, à moins que vous n'utilisiez un paramètre de type trap
ou un try/catch
pour gérer l'erreur de terminaison.
Il y a une chose à noter, si vous définissez $ErrorActionPreference
a "Stop"
et utiliser Write-Error
elle le fera produire une erreur de terminaison .
Dans le script que vous avez lié, 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 arrêter l'exécution de cette fonction et afficher un message d'erreur à l'écran mais ne voulait pas que l'ensemble du script arrête de s'exécuter. L'auteur du script aurait pu utiliser throw
cependant, cela signifierait que vous devriez utiliser une try/catch
lors de l'appel de la fonction.
return
quittera la portée actuelle qui peut être une fonction, un script, ou un bloc script. Ceci est mieux illustré avec du code :
# A foreach loop.
foreach ( $i in (1..10) ) { Write-Host $i ; if ($i -eq 5) { return } }
# A for loop.
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 problème ici est d'utiliser return
con ForEach-Object
. Il ne brisera pas la transformation comme on pourrait s'y attendre.
Plus d'informations :
4 votes
Qu'est-ce que tu veux dire ? Si Write_error permet au script de continuer, il est très compréhensible d'avoir une déclaration de retour après Write-Error. L'erreur a été écrite et vous revenez au code qui a appelé la fonction en premier lieu. Puisque Throw est destinée à mettre fin aux erreurs, elle se terminera automatiquement, de sorte qu'une déclaration de retour dans une déclaration throw est inutile.
1 votes
@Gisli : Il est important de noter que
return
hace no retourne à l'appelant dans leprocess
d'une fonction (avancée) ; au lieu de cela, il passe au bloc objet d'entrée suivant en cours de réalisation. En effet, il s'agit du scénario typique de génération d'erreurs de non-terminaison : si le traitement d'autres objets d'entrée est encore possible.1 votes
Notez que
Throw
génère un script -qui n'est pas la même que l'erreur de terminaison. déclaration -les erreurs de terminaison déclenchées, par exemple, parGet-Item -NoSuchParameter
o1 / 0
.