在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)最多应报告语句终止错误,而
Throw
(脚本终止错误)应仅限于脚本,但请注意,这与Throw
的使用相矛盾强制执行强制性参数。也许脚本终止错误和语句终止错误之间的问题区分最终是无意的,也许最初的意图是只使用脚本终止错误,这可以解释为什么当前所有文档都只谈论抽象中的错误终止而没有甚至提到区别。
关于powershell - throw和$ pscmdlet.ThrowTerminatederror()之间的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49204918/