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

它们是相同还是不同?如果它们不同,那么哪一个更可取?

最佳答案

Throw创建一个脚本终止(运行空间终止)错误,而 $PScmdlet.ThrowTerminatingError()创建一个语句终止错误
注意:这些不是官方术语(文档目前仅模糊地引用了抽象中的终止错误,没有范围),但是它们对于描述实际行为很有用。
简而言之:默认情况下,

  • 脚本终止错误终止整个运行空间 ,即正在运行的脚本及其所有调用程序,而没有执行其他语句。
  • 拦截它们的唯一方法是使用try/catch语句(或更不常见的是trap语句)。

  • ,而是语句终止错误仅在当前语句(函数$PScmdlet.ThrowTerminatingError()及其调用的一部分,通常是管道)中终止,执行将继续执行下一条语句。
  • 它们也可以被try/catch(或trap)拦截,或者可以通过将$ErrorActionPreference首选项变量设置为SilentlyContinue来忽略它们。相反,-ErrorAction公用参数对它们没有影响。
  • 相反,您可以使用$ErrorActionPreference = 'Stop'将它们提升为脚本终止错误,尽管文档声称$ErrorActionPreference仅与非终止错误(第三种错误类型)有关。


    有关更多信息,请参见this (unofficial) overview of PowerShell's error handling
    至于指导何时使用哪种类型的错误:
  • Throw 帮助主题中,关于何时使用about_Throw 的指南很少。给出了一个示例用例,其中在没有必需参数的情况下使用Throw中止函数/脚本,以替代PowerShell提示它的默认行为。
  • 请注意,Throw,即引发脚本终止错误会终止整个运行空间(正在运行的脚本及其任何调用程序),除非被捕获。

  • Cmdlet Error Reporting文章仅讨论 cmdlet内部使用有关何时报告语句终止(在本文中称为“终止”)与非终止错误的关系。
  • 在我的this answer中可以找到文章的简要摘要。


  • 鉴于后者,您可能会争辩说,高级功能(如cmdlet)最多应报告语句终止错误,而Throw(脚本终止错误)应仅限于脚本,但请注意,这与Throw的使用相矛盾强制执行强制性参数。
    也许脚本终止错误和语句终止错误之间的问题区分最终是无意的,也许最初的意图是只使用脚本终止错误,这可以解释为什么当前所有文档都只谈论抽象中的错误终止而没有甚至提到区别。

    关于powershell - throw和$ pscmdlet.ThrowTerminatederror()之间的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49204918/

    10-14 16:11