powershell throw和$pscmdlet之间的区别,throwTerminatingerror()?

wz3gfoph  于 2023-01-13  发布在  Shell
关注(0)|答案(1)|浏览(140)

在PowerShell中,throw $ErrorMsg$PScmdlet.ThrowTerminatingError($ErrorMsg)之间有什么区别?
它们是相同的还是不同的?如果不同,哪一个更好?

t3irkdon

t3irkdon1#

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

注意:这些不是官方术语(文档目前只是抽象地模糊引用 * 终止 * 错误,没有范围),但它们对于描述实际行为很有用。
简而言之:默认情况下,

*一个 * 脚本 *-终止错误在缺省情况下终止整个运行空间,即运行脚本及其所有调用者,而不再执行任何语句;换句话说:除非捕获或抑制这样的错误,否则它是致命的

  • 可以使用**try / catch语句**(或者,不太常见的trap语句)* 捕获 * 它们。
  • 通过将**$ErrorActionPreference首选项变量**设置为'SilentlyContinue'或(仅限PowerShell(Core)7+)设置为'Ignore',可以 * 抑制 * 它们。
  • a statement-terminating error仅终止当前语句(调用$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 Error Reporting文章仅讨论了cmdlet-internal * use关于**何时报告 * 语句 -terminating(在文章中仅称为“terminating”)与 * 非terminating * error
  • 文章的简要摘要可在this answer中找到。

考虑到后者,您可能会认为 * 高级函数 * -因为它们类似于cmdlet-应该 * 最多 * 报告 * 语句 -终止错误,并且Throw 脚本 *-终止错误)应该限制为 * 脚本 *,但请注意,这与使用Throw强制强制强制参数相矛盾。

  • 也许**脚本 *-终止错误和 * 语句 *-终止错误之间的有问题的区别最终是 * 无意的 也许 * 最初的意图是永远只有 * 脚本 *-终止错误,这就解释了为什么所有当前的文档只抽象地谈论 * 终止 * 错误,甚至没有提到这种区别。

相关问题