"throw"关键字和"Write-Error -ErrorAction Stop"之间有什么区别?

Adi*_*bar 2 powershell

我无法在谷歌上搜索一个明确的答案.例如,throw 'temper tantrum'和之间是否存在实际差异Write-Error 'temper tantrum' -ErrorAction Stop

它们都会产生终止错误并设置$?为假.我可以看到CategoryInfo和FullyQualifiedErrorId存在差异.操作词是实用的.他们有不同的效果吗?在特定情况下,是否有理由偏好另一个?

Ans*_*ers 7

throw生成终止错误,Write-Error-ErrorAction Stop不会产生非终止错误.由于-ErrorAction Stop将非终止转换为终止错误,因此两条指令基本相同.

但是,存在差异.throw <expression>填充$error[0].TargetObject<expression>,而Write-Error <expression> -ErrorAction Stop不会.

  • 这远非第一次有人在PowerShell中找到多种不同的方法来做同样的事情.:-)使用`throw`是表达终止错误的规范方式,`Write-Error`是表达非终止错误的规范方式(1000个中的一个文件正在使用中 - 我会注意到非终止错误但继续处理其他999).实际上,所有cmdlet都实现了无处不在的参数-ErrorAction,即存在这种极端情况(Write-Error -ea Stop). (5认同)
  • @AdiInbar我总是使用`throw`来生成终止错误.它不仅更短,而且还是其他语言中众所周知的语法,并且就其功能而言,它更加不言自明.我只使用`Write-Error`来表达它的名字:将错误消息写入错误流. (2认同)