Write-Error
следует использовать, если вы хотите сообщить пользователю о некритической ошибке. По умолчанию все, что он делает, это печатает сообщение об ошибке красным текстом на консоли. Это не останавливает конвейер или цикл от продолжения. Throw
, с другой стороны, выдает то, что называется завершающей ошибкой. Если вы используете команду throw, конвейер и / или токовая петля будут прерваны. Фактически все выполнение будет прекращено, если вы не используете структуру trap
или try/catch
для обработки ошибки завершения.
Следует отметить одну вещь, если вы установите $ErrorActionPreference
на "Stop"
и используете Write-Error
, это приведет к завершающей ошибке .
В скрипте, на который вы ссылались, мы находим следующее:
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
}
Похоже, что автор этой функции хотел остановить выполнение этой функции и отобразить сообщение об ошибке на экране, но не хотел, чтобы весь скрипт прекратил выполнение. Автор сценария мог бы использовать throw
, однако это означало бы, что при вызове функции вам придется использовать try/catch
.
return
выйдет из текущей области, которая может быть функцией, сценарием или блоком сценария. Это лучше всего иллюстрируется кодом:
# 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 } }
Вывод для обоих:
1
2
3
4
5
Один гоча здесь использует return
с ForEach-Object
. Это не нарушит обработку, как можно было бы ожидать.
Дополнительная информация: