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
. Это не нарушит обработку, как можно было бы ожидать.
Больше информации:
person
Andy Arismendi
schedule
15.02.2012
return
не возвращается к вызывающему в блокеprocess
(расширенной) функции; вместо этого он переходит к следующему входному объекту в конвейере. Действительно, это типичный сценарий генерации непрекращающихся ошибок: если обработка дальнейших входных объектов все еще возможна. - person mklement0   schedule 27.09.2016Throw
генерирует ошибку, завершающую сценарий, что не то же самое, что и ошибки, завершающие оператор, вызванные, например,Get-Item -NoSuchParameter
или1 / 0
. - person mklement0   schedule 16.08.2017