在PowerShell中,throw $ErrorMsg
和$PScmdlet.ThrowTerminatingError($ErrorMsg)
之间的区别是什么?
它们是相同还是不同?如果它们不同哪一个更好?
答案 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 使用 - 终止(在文章中称为“终止”)与非终止错误。
考虑到后者,您可以认为高级函数 - 因为它们就像cmdlet一样 - 最多 报告语句 - 终止错误并且Throw
(脚本 - 终止错误)应限于脚本,但请注意,这与使用Throw
强制执行必需参数相矛盾
或许 脚本 -terminating和语句之间的问题区别 - 终止错误最终无意和也许最初的意图是只有脚本 - 终止它们,这可以解释为什么所有当前文档只讨论终止错误的摘要,甚至没有提到这种区别。