2015-10-13 36 views
1

我正在使用电源外壳控制台下面的电源外壳脚本:PowerShell的非终止错误,并尝试catch块

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

此打印错误。然后继续并打印“创建新对象”和“结束”。所以我认为这是一个非终止错误。

但如果我把尝试围绕新对象catch块如下:

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

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

我的问题是:

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

回答

2

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

-ErrorAction停止开关正好有效地使cmdlet抛出一个终止错误,以便您可以捕获错误,它不会停止脚本(因此为什么您的最后一行仍然执行)。如果你想让脚本停下来,你可以把Exit命令放在catch块中来结束脚本。

参见:

Terminating Errors

Non-Terminating Errors