在 PowerShell 中,throw $ErrorMsg
和 $PScmdlet.ThrowTerminateError($ErrorMsg)
之间有什么区别?
它们是相同还是不同?如果它们不同,哪一个更可取?
最佳答案
<强> Throw
创建脚本终止(运行空间终止)错误,而 $PScmdlet.ThrowTerminatingError()
创建一个语句-终止错误。
注意:这些不是官方术语(文档目前仅在摘要中模糊地引用终止错误,没有范围),但它们对于描述事实上的行为。
简而言之:默认情况下,
脚本终止错误默认终止整个运行空间,即正在运行的脚本及其所有调用者,没有进一步的语句被执行;换句话说:除非发现或抑制此类错误,否则它是致命的。
他们可以用
try
/catch
捕获声明(或者,不太常见的是trap
声明)。可以通过设置
$ErrorActionPreference
preference variable 来抑制它们。 至'SilentlyContinue'
,或 - 仅在 PowerShell(核心)7+ 中 - 至'Ignore'
.
而语句终止错误仅终止当前语句(调用
$PScmdlet.ThrowTerminatingError()
的函数及其所在的语句)的一部分,通常是管道),默认情况下执行继续到下一个语句。它们可以像脚本终止错误一样被捕获或抑制,但请注意common
-ErrorAction
parameter对他们没有影响。相反,您可以使用
$ErrorActionPreference = 'Stop'
将它们提升为脚本终止错误。 ,尽管文档声称$ErrorActionPreference
仅适用于非终止错误,即第三种错误类型(-ErrorAction
参数专门适用于该类型)。
有关详细信息,请参阅 this (unofficial) overview of PowerShell's error handling .
至于指导何时使用哪种类型的错误:
关于何时使用
Throw
几乎没有什么指导。 在about_Throw
帮助主题;给出了一个示例用例,其中Throw
用于在没有强制参数的情况下中止函数/脚本,作为 PowerShell 提示的默认行为的替代方案。- 请注意
Throw
,即,抛出脚本终止错误会终止整个运行空间(正在运行的脚本及其任何调用者),除非被捕获。
- 请注意
Cmdlet Error Reporting本文仅讨论cmdlet-internal使用与何时报告语句终止(本文中仅称为“终止”)与非终止错误。
- 本文的简明摘要可以在 this answer 中找到。 .
考虑到后者,您可能会认为高级函数 - 因为它们就像 cmdlet - 至多应该报告语句 - 终止错误那Throw
(脚本-终止错误)应仅限于脚本,但请注意,这与 Throw
的使用相矛盾强制执行强制参数。
也许脚本终止和语句终止错误之间的有问题的区别最终是无意和>也许最初的意图是只存在脚本终止,这可以解释为什么所有当前文档只在抽象中谈论终止错误,甚至没有提到区别。
关于powershell - throw 和 $pscmdlet.ThrowTerminateerror() 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49204918/