gpt4 book ai didi

powershell - 我什么时候应该使用 Write-Error 与 Throw?终止错误与非终止错误

转载 作者:行者123 更新时间:2023-12-03 04:28:34 24 4
gpt4 key购买 nike

查看 PoshCode 上的 Get-WebFile 脚本,http://poshcode.org/3226 ,我注意到这个对我来说很奇怪的装置:

$URL_Format_Error = [string]"..."
Write-Error $URL_Format_Error
return

与以下原因相比,造成这种情况的原因是什么?

$URL_Format_Error = [string]"..."
Throw $URL_Format_Error

或者更好:

$URL_Format_Error = New-Object System.FormatException "..."
Throw $URL_Format_Error

据我了解,您应该使用 Write-Error 来处理非终止错误,并使用 Throw 来处理终止错误,所以在我看来,您不应该使用 Write-Error 后跟 Return。有区别吗?

最佳答案

如果您想通知用户非严重错误,则应使用

Write-Error。默认情况下,它所做的只是在控制台上以红色文本打印错误消息。它不会停止管道或循环的继续。另一方面,Throw 会产生所谓的终止错误。如果使用 throw,管道和/或当前循环将终止。事实上,除非您使用 traptry/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 将退出当前作用域,该作用域可以是函数、脚本或脚本 block 。最好用代码来说明:

# 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

这里的一个问题是使用 returnForEach-Object。它不会像人们预期的那样破坏处理。

更多信息:

关于powershell - 我什么时候应该使用 Write-Error 与 Throw?终止错误与非终止错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9294949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com