Powershell非终止错误并尝试catch块

时间:2015-10-13 09:11:37

标签: powershell

我使用power shell console运行以下power shell脚本:

$ob1 = "nonexistingclass"
$a = new-object $ob1 
Write-Output "Created new object"
Write-Output "End"

这会打印错误。然后继续并打印"创建的新对象"和"结束"。所以我假设这是一个非终止错误。

但是如果我把try catch块放在new-object周围,如下所示:

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

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

我的问题是:

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

2 个答案:

答案 0 :(得分:2)

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

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

请参阅:

Terminating Errors

Non-Terminating Errors

答案 1 :(得分:1)

根据文档,PowerShell错误有两种类型, 终止和不终止。

还有另一种晦涩的第三类错误。这些错误被捕获 trytrap,即它们的行为就像终止,但不会停止 在没有trytrap的情况下执行,即它们的行为就像是非终止的。

例如,如果命令名称未被识别为cmdlet的名称, 函数,脚本文件或可操作程序,然后PowerShell会发出错误。是 这个错误是否终止?这取决于。缺省情况下,并非如此。

似乎经常使用错误操作首选项 Stop try或 在脚本中使用trap块是一个好主意。否则可能会出现半终止错误 因为调用继续而导致问题。请注意,默认错误操作 首选项是继续

半终止错误的示例:

  1. 找不到命令。
  2. 除以零。
  3. 使用错误的参数调用.NET方法。
  4. PowerShell无法将数据转换为某种类型。
  5. 找不到.NET类型。 (注意您的情况
  6. 在严格模式下找不到属性。
  7. 在严格模式下找不到变量。
  8. 找不到命令参数。
  9. 分配给不可写变量。
  10. 不支持的提供程序功能。
  11. .NET异常。

列表可能会继续...

假设

测试表明,任何运行时异常都是半终止错误。

查看完整的测试脚本案例-PowerShellTraps/Errors-of-unusual-type


更新(如评论中所述):

关于此类错误详细信息的官方文档并不多。 但是以下是PowerShell文档存储库中的全面讨论:

https://github.com/MicrosoftDocs/PowerShell-Docs/issues/1583