Powershell $Error 对象没有立即填充到 PSM1 模块中

标签 powershell exception-handling

我在使用 Powershell 时遇到了一个特殊问题。我在 catch block 中捕获了一个异常,但没有填充全局 $Error 对象。

一个简单的例子,它会按预期运行是这样的:

function Bar
{
  Foo
}

function Foo
{
  try
  {
    $Error.Clear()
    throw "Error!"
  }
  catch
  {
    "Caught an error - current error count $($Error.Count)"  
  } 
  finally
  {
    "Cleaning up - current error count $($Error.Count)"  
  }
}

如果您调用 Bar,输出与您期望的一样
Caught an error - current error count 1
Cleaning up - current error count 1

我遇到问题的代码几乎相同,只是它从模块加载 Foo 。不确定这是一个错误,还是我不明白的东西(必须检查我的 Powershell in Action 书!)

如果我将 Foo 保存到一个模块 - Foo.psm1
function Foo
{
  try
  {
    $Error.Clear()
    throw "Error!"
  }
  catch
  {
    "Caught an error - current error count $($Error.Count)"  
  } 
  finally
  {
    "Cleaning up - current error count $($Error.Count)"  
  }
}

Export-ModuleMember -Function Foo

然后我执行以下操作
Import-Module .\Foo.psm1
$Error.Clear()
"Current error count $($Error.Count)"
Foo
"Current error count $($Error.Count)"

我最终得到
Current error count 0
Caught an error - current error count 0
Cleaning up - current error count 0
Current error count 1

请注意,Foo 不再看到对 $Error 所做的任何更改。因此,代码的模块化正在改变错误传播行为。任何人都可以加入这背后的推理吗?

我应该注意,我可以通过自动变量 $_ 获取特定的捕获异常,但我希望在调用堆栈中的这一点上获得整个集合。

最佳答案

我之前没有注意到这一点,但也许 $error 集合像任何其他变量一样被限定为模块。尝试在测试脚本的关键点比较以下两个显式范围变量的值:

"Errors - Global: {0}; Module: {1}" -f $global:error.count, $script:error.count

让我知道你是怎么办的。

关于Powershell $Error 对象没有立即填充到 PSM1 模块中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11442023/

相关文章:

powershell - 重命名项目并覆盖(如果文件名存在)

C++:如何捕获构造函数抛出的异常?

windows - 创建证书的 New-SelfSignedCertificate 给出拒绝访问

Powershell帮助,如果进程存在,停止它,否则启动服务?

powershell - 找不到计算机的唯一ID AD属性

java - 处理从自定义转换器抛出的 Spring Boot REST 中的异常

python - 获取未从 Python 中的 NameError 定义的名称

php - 没有捕获到异常时,php 5 try catches 会影响性能吗?

python - 处理 PyMySql 异常 - 最佳实践

powershell - 列出一个文件夹结构中不在另一个文件夹结构中的文件