在PowerShell中,throw $ErrorMsg和$PScmdlet.ThrowTerminatingError($ErrorMsg)之间有什么区别?它们是相同的还是不同的?如果不同,哪一个更好?
throw $ErrorMsg
$PScmdlet.ThrowTerminatingError($ErrorMsg)
t3irkdon1#
Throw创建一个 * 脚本 -终止(运行空间-终止)错误,而*$PScmdlet.ThrowTerminatingError()创建一个 * 语句 -终止错误*。
Throw
$PScmdlet.ThrowTerminatingError()
注意:这些不是官方术语(文档目前只是抽象地模糊引用 * 终止 * 错误,没有范围),但它们对于描述实际行为很有用。简而言之:默认情况下,
*一个 * 脚本 *-终止错误在缺省情况下终止整个运行空间,即运行脚本及其所有调用者,而不再执行任何语句;换句话说:除非捕获或抑制这样的错误,否则它是致命的。
try
catch
trap
$ErrorActionPreference
'SilentlyContinue'
'Ignore'
-ErrorAction
$ErrorActionPreference = 'Stop'
有关详细信息,请参见this (unofficial) overview of PowerShell's error handling。关于何时使用哪种类型错误的指导:
about_Throw
考虑到后者,您可能会认为 * 高级函数 * -因为它们类似于cmdlet-应该 * 最多 * 报告 * 语句 -终止错误,并且Throw( 脚本 *-终止错误)应该限制为 * 脚本 *,但请注意,这与使用Throw强制强制强制参数相矛盾。
1条答案
按热度按时间t3irkdon1#
Throw
创建一个 * 脚本 -终止(运行空间-终止)错误,而*$PScmdlet.ThrowTerminatingError()
创建一个 * 语句 -终止错误*。注意:这些不是官方术语(文档目前只是抽象地模糊引用 * 终止 * 错误,没有范围),但它们对于描述实际行为很有用。
简而言之:默认情况下,
*一个 * 脚本 *-终止错误在缺省情况下终止整个运行空间,即运行脚本及其所有调用者,而不再执行任何语句;换句话说:除非捕获或抑制这样的错误,否则它是致命的。
try
/catch
语句**(或者,不太常见的trap
语句)* 捕获 * 它们。$ErrorActionPreference
首选项变量**设置为'SilentlyContinue'
或(仅限PowerShell(Core)7+)设置为'Ignore'
,可以 * 抑制 * 它们。$PScmdlet.ThrowTerminatingError()
的函数及其所属语句,通常是 * 管道 *),执行默认继续 next 语句。-ErrorAction
* 参数 * 对它们 * 没有 * 影响。$ErrorActionPreference = 'Stop'
将它们 * 提升 * 为脚本终止错误,尽管文档声称$ErrorActionPreference
仅与第三种错误类型(-ErrorAction
参数 * 专门 * 应用于此)* 非终止 * 错误有关。有关详细信息,请参见this (unofficial) overview of PowerShell's error handling。
关于何时使用哪种类型错误的指导:
about_Throw
帮助主题中**几乎没有关于何时使用Throw
**的指导;给出了一个示例用例,其中Throw
用于在缺少强制参数的情况下中止函数/脚本,作为PowerShell的默认行为 * prompt * 的替代。Throw
(即抛出 script-terminating错误)会终止整个运行空间(运行脚本及其任何调用者),除非被捕获。考虑到后者,您可能会认为 * 高级函数 * -因为它们类似于cmdlet-应该 * 最多 * 报告 * 语句 -终止错误,并且
Throw
( 脚本 *-终止错误)应该限制为 * 脚本 *,但请注意,这与使用Throw
强制强制强制参数相矛盾。