我在使用 Powershell 时遇到了一个特殊问题。我在 catch 块中捕获异常,但未填充全局 $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 所做的任何更改。因此,代码的模块化正在改变错误传播行为。谁能解释一下这背后的原因吗?
我应该注意,我可以通过自动变量 $_ 获取特定的捕获异常,但我希望在调用堆栈中的此时获取整个集合。