throw和$ pscmdlet.ThrowTerminatingerror()之间的区别?

Sam*_*abu 8 powershell exception

在PowerShell中,throw $ErrorMsg和之间有什么区别$PScmdlet.ThrowTerminatingError($ErrorMsg)

它们是相同还是不同?如果它们不同哪一个更好?

mkl*_*nt0 12

Throw创建脚本 -终止(运行空间终止)错误,同时$PScmdlet.ThrowTerminatingError()创建一个语句终止错误.

注意:这些不是官方术语(文档目前只是模糊地引用抽象中的终止错误,没有范围),但它们对描述事实上的行为很有用.

简而言之:默认情况下,

  • 一个脚本 -terminating错误终止的整个运行空间,即运行脚本及其所有调用,以获取执行没有进一步的陈述.

    • 拦截它们的唯一方法是使用try/ catch语句(或者不常见的是trap语句).
  • 一个语句 -终止错误只会终止当前语句(函数调用$PScmdlet.ThrowTerminatingError()和它所属的语句,通常是一个管道),并继续执行下一个语句.

    • 他们也可以被截获try/ catch(或trap),或忽视$ErrorActionPreference设置选项变量SilentlyContinue; 相比之下,-ErrorAction常见的参数没有对他们的影响.

    • 相反,尽管文档声称仅涉及非终止错误,但第3种错误类型,您可以将它们提升为脚本终止错误.$ErrorActionPreference = 'Stop'$ErrorActionPreference

有关更多信息,请参阅PowerShell错误处理的此(非官方)概述.

至于何时使用哪种类型的错误的指导:

  • 关于何时Throwabout_Throw帮助主题中使用,几乎没有什么指导 ; 给出了一个示例用例,其中Throw用于在没有强制参数的情况下中止函数/脚本,作为PowerShell 提示它的默认行为的替代方法.

    • 请注意Throw,即抛出脚本 -终止错误会终止整个运行空间(正在运行的脚本及其任何调用者),除非被捕获.
  • Cmdlet的错误报告本文只讨论cmdlet的内部使用相对于何时报告陈述 -terminating(在文章就叫"终止")与无穷的错误.

    • 在我的这个答案中可以找到该文章的简明摘要.

鉴于后者,您可以认为高级函数 - 因为它们就像cmdlet一样 - 最多应该报告语句 -终止错误并且Throw(脚本 -终止错误)应该仅限于脚本,但请注意这与Throw强制执行的使用相矛盾强制参数.

也许脚本 -终止和声明 -终止错误之间的问题区别最终是无意的,也许最初的意图是只有脚本 -终止它们,这可以解释为什么所有当前文档只讨论在抽象中终止错误,没有甚至提到了区别.