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

时间:2018-03-10 03:03:41

标签: powershell exception

在PowerShell中,throw $ErrorMsg$PScmdlet.ThrowTerminatingError($ErrorMsg)之间的区别是什么?

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

1 个答案:

答案 0 :(得分:11)

Throw创建脚本 - 终止(运行空间终止)错误,而 $PScmdlet.ThrowTerminatingError()创建语句< / em> - 终止错误

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

简而言之:默认情况下,

  • 脚本 - 终止错误终止整个运行空间,即正在运行的脚本及其所有调用者,没有进一步的陈述被执行。

    • 拦截它们的方法是使用try / catch语句(或者不常见的是trap语句)。
  • a 语句 - 终止错误终止仅当前语句(函数调用$PScmdlet.ThrowTerminatingError()和语句它是管道)的一部分,继续执行 next 语句。

    • 他们也可以try / catch(或trap)拦截,或忽略 $ErrorActionPreference首选项变量设为SilentlyContinue;相比之下,-ErrorAction常见参数对它们有 no 效果。

    • 相反,尽管文档声称$ErrorActionPreference = 'Stop'仅与无终止宣传使用$ErrorActionPreference来解决错误的脚本错误em>错误,第3种错误类型。

有关详细信息,请参阅this (unofficial) overview of PowerShell's error handling

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

  • about_Throw帮助主题中有关于何时使用Throw指引很少;给出了一个示例用例,其中Throw用于在没有强制参数的情况下中止函数/脚本,作为PowerShell默认行为提示的替代方法。

    • 请注意Throw,即抛出脚本 - 终止错误会终止整个运行空间(正在运行的脚本及其任何调用者),除非被捕获。
  • Cmdlet Error Reporting文章仅针对何时举报声明讨论 cmdlet-internal 使用 - 终止(在文章中称为“终止”)与非终止错误

    • 该文章的简明摘要可以在我的this answer中找到。

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

或许 脚本 -terminating和语句之间的问题区别 - 终止错误最终无意也许最初的意图是只有脚本 - 终止它们,这可以解释为什么所有当前文档只讨论终止错误的摘要,甚至没有提到这种区别。