晦涩难懂的第三类错误

时间:2015-04-26 21:49:12

标签: powershell

我们都听说过PowerShell有两种类型的错误:终止和非终止错误。

描述非终止错误的原因是它只是输出到错误流并允许脚本继续执行。但是,它不能被try / catch捕获,因为实际上没有例外被抛出。

对于终止错误,它都将错误输出到错误流,如果未处理,则完全停止其轨道上的脚本,防止执行错误的行下方的任何内容。它可以通过尝试/捕获来捕获。

然而,似乎存在第三种类型的错误,我似乎无法找到有关的信息或名称。

这是一个错误,它是终止和非终止错误之间的混合......当生成时,它不会终止脚本,给它一个非终止错误的属性,但它可以是被try / catch捕获,它给出了终止错误的属性!

它可能是最基本的错误类型。它本身直接抛出异常,而不是由PowerShell的函数或cmdlet抛出。

几个例子:

  • 除以0。
  • 使用错误的参数调用对象的方法 - 错误的参数类型(PowerShell无法自动强制),错误的参数数量等等 - 例如:'a'.Split([object[]])

问题是,这些被称为什么,为什么它们与其他两种类型不同?该对象仍然是一个ErrorRecord,而不是Exception,所以它们应该像终止或非终止错误,而不是两者的突变。

1 个答案:

答案 0 :(得分:1)

微软没有特殊名称"它",即使您需要设置$ErrorActionPreference = "Stop"以使它们对终止错误的行为相同,它们也只是将其称为终止错误会(停止剧本)。

  

因为Windows PowerShell无法识别" nonsenseString"作为一个   cmdlet或其他项,它返回 CommandNotFoundException 错误。   此终止错误被特定的陷阱语句捕获。

     

以下脚本示例包含相同的Trap语句   一个不同的错误:

  trap {"Other terminating error trapped" }
  trap [System.Management.Automation.CommandNotFoundException] 
      {"Command error trapped"}
  1/$null
     

运行此脚本会产生以下结果:

  Other terminating error trapped
  Attempted to divide by zero.
  At C:PS> errorX.ps1:3 char:7
  +     1/ <<<< $null
     

尝试除以零不会创建   CommandNotFoundException错误。相反,该错误被困住了   另一个Trap语句,它会捕获任何终止错误

来源:about_Trap @ technet.microsoft.com