Powershell非终止错误并尝试catch块

MSD*_*MSD 4 powershell

我正在使用 power shell 控制台运行以下 power shell 脚本:

$ob1 = "nonexistingclass"
$a = new-object $ob1 
Write-Output "Created new object"
Write-Output "End"
Run Code Online (Sandbox Code Playgroud)

这会打印错误。然后继续打印“Created new object”和“End”。所以我假设这是一个非终止错误。

但是,如果我将 try catch 块放在新对象周围,如下所示:

$ob1 = "nonexistingclass"
try
{
    $a = new-object $ob1 
    Write-Output "Created new object"
}
catch
{ 
    Write-Error "Exception Message: $($_.Exception.Message)"     
}
Write-Output "End"
Run Code Online (Sandbox Code Playgroud)

在这种情况下,catch 块被命中并写入异常消息。

我的问题是:

  1. 这是一个非终止错误吗?它看起来像一个非终止错误,因为在错误之后继续执行(当没有 try catch 块时)。
  2. 如果这是非终止错误,为什么在我添加 try catch 块时会命中 catch 块?我的理解是仅在终止错误时才会执行 catch 块。
  3. 即使我在第一个示例(没有 try catch 块)中使用 -ErrorAction Stop 调用 new-object ,它仍然继续执行并打印最后 2 行。当我使用 -ErrorAction stop 时,我期望它应该抛出一个终止异常并且脚本执行应该停止。我的理解有误吗?

ste*_*ary 5

终止错误并不总是意味着脚本将停止执行,它通常只是意味着它们抛出 a PipelineStoppedException,这意味着处理将在该管道上停止,但将继续执行脚本的其余部分。所以要回答你的问题,是的,这是一个终止错误,但它并没有停止整个脚本的执行,这就是它命中 catch 块的原因。

-ErrorAction 停止开关只是有效地使 cmdlet 抛出终止错误,以便您可以捕获错误,它不会停止脚本(因此仍然执行最后一行的原因)。如果您希望脚本停止,您可以将Exit命令放在 catch 块中以在该点结束脚本。

看:

终止错误

非终止错误