我希望模块中的所有函数都默认为$ErrorActionPreference = 'Stop'. 是否可以不修改所有功能?
我每个函数都有一个文件。
假设你的模块是一个脚本模块,即用 PowerShell 代码实现:
重要:
模块有自己的作用域堆栈,独立于非模块代码(和其他模块)的作用域。虽然这提供了从主叫方环境隔离,其通常是有用的,这也意味着,在调用者的 $ErrorActionPreference价值从未生效脚本模块功能(除非你直接从运行的全球范围,其模块也见) -但它这样做的编译小命令。这个 GitHub 问题 中讨论了这种非常有问题的行为。
因此,即使您目前无法通过调用方的方式控制脚本模块的错误行为,但通过在您的模块中$ErrorActionPreference设置(覆盖)$ErrorActionPreference ,您将永久关闭该门。
但是,为特定调用使用-ErrorAction 公共参数而不是$ErrorActionPreference 首选项变量仍将覆盖您的模块全局$ErrorActionPreference值,因为在幕后,PowerShell 将-ErrorAction参数转换为具有该值的函数局部 $ErrorActionPreference变量。
在-ErrorAction和$ErrorActionPreference机制是由矛盾和模糊的行为困扰-这GitHub的文档问题提供的PowerShell的错误处理的全面概述。
我希望模块中的所有函数都默认为
$ErrorActionPreference = 'Stop'. 是否可以不修改所有功能?
是的 - 只需放置$ErrorActionPreference = 'Stop'在RootModule *.psm1文件的顶级代码中。(RootModule模块清单文件 ( *.psd1)的条目指定模块的主模块 - 请参阅文档)。
RootModule引用.psm1文件的条目,只需.psm1在您的模块文件夹(通常以封闭模块命名)中创建一个包含 content 的文件$ErrorActionPreference = 'Stop',并从RootModule条目中引用它- 请参阅此答案以获取背景信息。除非调用者-ErrorAction在调用模块函数时使用公共参数覆盖(假设它们是高级函数),否则模块的顶级$ErrorActionPreference值将对模块的所有函数有效,除非您的函数直接发出语句-termination错误[1],在这种情况下,调用者的 $ErrorActionPreference值很重要。
如果您的模块是二进制模块,即导出已编译的 cmdlet(通常在 C# 中实现):
编译的 cmdlet 没有自己的作用域——它们在调用者的作用域中运行。因此,调用者很 $ErrorActionPreference重要,可以使用公共参数在每次调用的基础上覆盖它-ErrorAction,但仅适用于非终止错误。
与脚本模块的高级功能,直接发出声明-terminating错误[1]是始终受制于呼叫者的$ErrorActionPreference价值,即使-ErrorAction被使用。(请注意,二进制 cmdlet 不会发出脚本终止错误)。
[1]语句终止错误发生在以下情况:
直接中止封闭 cmdlet 或高级函数/脚本的执行:
当二进制cmdlet遇到阻止其继续运行的严重错误时,它会报告该ThrowTerminatingError()方法的此类错误(或仅引发异常)。
高级 PowerShell 函数/脚本同样必须使用$PSCmdlet.ThrowTerminatingError(),然而,这在实践中很少见;通常使用的Throw语句会创建一个脚本终止错误,默认情况下它也会终止整个线程,即也终止调用者及其所有调用者。
间接地,在 PowerShell 代码中:
当表达式导致运行时错误时,例如1 / 0or 'a,b' -split ',', 'NotAnInt'。
当 .NET方法调用引发异常时,例如[int]::Parse('NotAnInt')
当在高级函数/脚本中调用另一个 cmdlet 或高级函数/脚本时,它本身会直接发出语句终止错误。
请注意,高级函数/脚本无法中继语句终止错误,例如:
默认情况下($ErrorActionPreference包含'Continue',可能只是在本地范围内)表达式的/其他命令的终止错误实际上从调用者的角度变成了非终止错误。
随着$ErrorActionPreference设置'Stop',最初声明终止错误被提升到一个脚本-terminating错误。
| 归档时间: |
|
| 查看次数: |
2492 次 |
| 最近记录: |