catch块中的错误操作继续

时间:2017-10-07 10:27:38

标签: powershell

我的主管在工作时表示总是在catch块中使用ErrorAction -Continue

workflow foo {

try {
    Get-CimInstance -ClassName Win32_Product  | ? {$_.Vendor -eq 'Google Inc.'}
    }

catch {
    Write-Error "Something went wrong." -ErrorAction Continue
    Throw
    }
}

在这里使用-EA Continue有什么好处?它没有用处 - 接下来执行throw并终止脚本。

在功能和工作流程中。我的主管是否正确?

1 个答案:

答案 0 :(得分:1)

我认为-EA Continue在这种情况下与Write-Error一起使用,以确保即使作用域的Throw更改为$ErrorActionPreference,也会执行以下Stop $ErrorActionPreference

现在,至少是函数中的行为。

工作流程似乎有所不同。我正在测试您的示例,Stop设置为1/0try阻止$ErrorActionPreference = 1 workflow foo { try { 1/0 } catch { Write-Error "Something went wrong." -ErrorAction Continue Throw } } 以创建例外:

-EA Continue

无论Throw$ErrorActionPreference之前的行中是否-EA在这种情况下都没有被规定。因此,工作流中的$ErrorActionPreference = 1 function bar { try { 1/0 } catch { Write-Error "Something went wrong." -ErrorAction Continue Throw } } 似乎会覆盖由-ErrorAction Continue参数完成的任何每cmdlet设置。

正如我所说,这种行为与功能不同:

Throw

此处$ErrorActionPreference与正在执行的SilentlyContinue不同。

顺便说一句:如果您还想考虑Throw设置为Write-Error $_ -EA Continue(并且您没有使用工作流程)的情况,那么您可能想要替换Throw使用-EA,否则您的$ErrorActionPreference会默默地继续。

简而言之:如果您的想法与当前Throw无关,那么{{1}}参数似乎在您的工作流示例中无效。在函数中它是有意义的,但在这种情况下,也应该避免使用{{1}}语句。