我使用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块被命中并写入异常消息。
我的问题是:
答案 0 :(得分:2)
终止错误并不总是意味着脚本将停止执行,它通常意味着它们抛出PipelineStoppedException
,这意味着处理将在该管道上停止,但将继续执行脚本的其余部分。所以回答你的问题,是的,这是一个终止错误,但它并没有停止整个脚本的执行,这就是为什么它会遇到catch块。
-ErrorAction stop开关只是有效地使cmdlet抛出一个终止错误,这样你就可以捕获错误,它不会停止脚本(因此你的最后一行仍然被执行)。如果您希望脚本停止,您可以将Exit
命令放在catch块中以在此时结束脚本。
请参阅:
答案 1 :(得分:1)
根据文档,PowerShell错误有两种类型, 终止和不终止。
还有另一种晦涩的第三类错误。这些错误被捕获
try
和trap
,即它们的行为就像终止,但不会停止
在没有try
或trap
的情况下执行,即它们的行为就像是非终止的。
例如,如果命令名称未被识别为cmdlet的名称, 函数,脚本文件或可操作程序,然后PowerShell会发出错误。是 这个错误是否终止?这取决于。缺省情况下,并非如此。
似乎经常使用错误操作首选项 Stop 或try
或
在脚本中使用trap
块是一个好主意。否则可能会出现半终止错误
因为调用继续而导致问题。请注意,默认错误操作
首选项是继续。
半终止错误的示例:
列表可能会继续...
假设
测试表明,任何运行时异常都是半终止错误。
查看完整的测试脚本案例-PowerShellTraps/Errors-of-unusual-type
更新(如评论中所述):
关于此类错误详细信息的官方文档并不多。 但是以下是PowerShell文档存储库中的全面讨论:
https://github.com/MicrosoftDocs/PowerShell-Docs/issues/1583