隐晦的第三种错误

Joh*_*ntu 5 powershell

我们从小就听过有关 PowerShell 的两种错误的故事:终止错误和非终止错误。

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

对于终止错误,它会将错误输出到错误流,并且如果未处理,则完全停止脚本的运行,从而防止执行发生错误的行以下的任何内容。它可以通过 try/catch 捕获。

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

这是一种介于终止错误和非终止错误之间的错误...生成时,它不会终止脚本,从而赋予其非终止错误的属性,但可以通过try/catch,这给了它终止错误的属性!

这是最基本的错误类型。它是 .NET 本身直接引发的异常,而不是由 PowerShell 的函数或 cmdlet 引发的。

几个例子:

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

问题是,它们叫什么?为什么它们与其他两种类型不同?该对象仍然是 ErrorRecord,而不是 Exception,因此它们实际上应该表现得像终止错误或非终止错误,而不是两者的突变。

Fro*_* F. 2

微软没有为“它”指定一个特殊的名称,他们只是将其称为终止错误,即使您需要进行设置$ErrorActionPreference = "Stop"以使它们的行为与终止错误相同(停止脚本)。

由于 Windows PowerShell 无法将“nonsenseString”识别为 cmdlet 或其他项,因此它会返回CommandNotFoundException错误。 该终止错误由特定的 Trap 语句捕获。

以下脚本示例包含相同的 Trap 语句,但有不同的错误:

  trap {"Other terminating error trapped" }
  trap [System.Management.Automation.CommandNotFoundException] 
      {"Command error trapped"}
  1/$null
Run Code Online (Sandbox Code Playgroud)

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

  Other terminating error trapped
  Attempted to divide by zero.
  At C:PS> errorX.ps1:3 char:7
  +     1/ <<<< $null
Run Code Online (Sandbox Code Playgroud)

尝试除以零不会产生 CommandNotFoundException 错误。相反,该错误由另一个 Trap 语句捕获,该语句捕获任何终止错误

来源:about_Trap@technet.microsoft.com