powershell - throw 和 $pscmdlet.ThrowTerminateerror() 之间的区别?

标签 powershell exception

在 PowerShell 中,throw $ErrorMsg$PScmdlet.ThrowTerminateError($ErrorMsg) 之间有什么区别?

它们是相同还是不同?如果它们不同,哪一个更可取?

最佳答案

<强> Throw创建脚本终止(运行空间终止)错误,而 $PScmdlet.ThrowTerminatingError()创建一个语句-终止错误

注意:这些不是官方术语(文档目前仅在摘要中模糊地引用终止错误,没有范围),但它们对于描述事实上的行为。

简而言之:默认情况下,

  • 脚本终止错误默认终止整个运行空间,即正在运行的脚本及其所有调用者,没有进一步的语句被执行;换句话说:除非发现或抑制此类错误,否则它是致命的

  • 语句终止错误仅终止当前语句(调用 $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/

相关文章:

powershell - 如何使用 Powershell 解析/管道命令行输出到对象

android - Android 异常的本地化

powershell - 批量禁用在 text/csv 文件中找到的本地帐户

wpf - Powershell WPF StackPanel无法正确更新

debugging - 发生异常时程序在 gdb 下卡住

java - 如何获取所有可能的函数异常的列表

ios - XCode:异常。如何检测原因?

c# - 吞下未处理的异常(调试器除外)

Powershell - 删除其他目录中存在的文件夹

powershell - 立即查找定义为文字的哈希表中的值