在 PowerShell 中,有什么区别throw $ErrorMsg
and $PScmdlet.ThrowTerminatingError($ErrorMsg)
?
它们是相同还是不同?如果它们不同,哪一个更可取?
Throw
创建一个script-终止(运行空间终止)错误, 然而$PScmdlet.ThrowTerminatingError()
创建一个陈述- 终止错误.
Note: 这些不是官方术语(该文档目前仅模糊地引用终止抽象中的错误,没有范围),但它们对于描述事实上的行为很有用。
简而言之:默认情况下,
-
a script- 终止错误终止整个运行空间默认情况下,即正在运行的脚本及其所有调用者,没有进一步执行的语句;换句话说:除非发现或抑制此类错误,否则fatal.
-
他们可以caught with a try / catch https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Try_Catch_Finally陈述(或者,不太常见的是,trap https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Trap陈述)。
-
他们可以压制通过设置$ErrorActionPreference偏好变量 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Preference_Variables#erroractionpreference to 'SilentlyContinue'
,或 - 仅在 PowerShell (Core) 7+ 中 - 至'Ignore'
.
-
whereas a 陈述- 终止错误终止仅当前声明(函数调用$PScmdlet.ThrowTerminatingError()
以及它所属的语句,通常是pipeline), with 执行继续next陈述默认情况下。
-
它们可以像脚本终止错误一样被捕获或抑制,但请注意the common -ErrorAction 范围 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_CommonParameters#-erroraction has no对他们的影响.
-
相反,你可以promote它们会导致脚本终止错误$ErrorActionPreference = 'Stop'
,尽管文档声称$ErrorActionPreference
仅适用于不终止的错误,第三种错误类型(其中-ErrorAction
范围只适用)。
有关更多信息,请参阅PowerShell 错误处理的(非官方)概述 https://github.com/PowerShell/PowerShell-Docs/issues/1583.
As for 指导何时使用哪种类型的错误:
-
有关于何时使用的指导很少Throw
in the about_Throw https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_throw帮助主题;给出了一个示例用例,其中Throw
用于在没有强制参数的情况下中止函数/脚本,作为 PowerShell 默认行为的替代方法提示 for it.
- 请注意
Throw
,即抛出一个script-termination 错误将终止整个运行空间(正在运行的脚本及其任何调用者),除非被捕获。
-
The Cmdlet 错误报告 https://learn.microsoft.com/en-us/powershell/scripting/developer/cmdlet/cmdlet-error-reporting文章仅讨论cmdlet 内部 use关于何时报告陈述-终止(本文中仅称为“终止”)与不终止的 errors.
- 文章的简要摘要可以在这个答案 https://stackoverflow.com/a/39949027/45375.
鉴于后者,你可以说高级功能- 因为它们就像 cmdlet - 应该at most report 陈述- 终止错误并且Throw
(script-终止错误)应限于scripts,但请注意,这与使用相矛盾Throw
强制执行强制参数。
Perhaps之间有问题的区别script-终止和陈述- 终止错误最终是无心的 and perhaps最初的意图是只拥有script-终止的,这可以解释为什么所有当前文档只谈论终止抽象错误,甚至没有提到区别。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)