$ Error变量是$ Null但$ _包含Catch中的错误

时间:2013-12-11 14:36:44

标签: powershell error-handling

我有PS模块,其中包含许多用于单个功能的脚本。还有一个“库”脚本,其中包含许多辅助函数,这些函数可以被模块中使用的函数调用。

让我们调用外部函数ReadWeb,它使用辅助函数ParseXML

本周我在内部帮助器ParseXML函数中遇到了错误处理问题。该函数包含一个try / catch,并在catch中查询:

$Error[0].Exception.InnerException.Message

...以将错误作为变量传递回外部作用域并确定ParseXML是否有效。

对于特定情况,我在调用ReadWeb时收到索引错误。根本原因是$ErrorCatch块中的ParseXML对象返回$Null

我更改了错误处理以检查$Error -eq $Null,如果是,请使用$_中的Catch来确定错误消息。

我的问题是:导致$Error $null内的Catch是什么?

2 个答案:

答案 0 :(得分:1)

$error是由Powershell处理的自动变量:about_Try_Catch_Finally中的长描述的第3段。

它被视为Catch块的上下文,因此可以$_获得。 由于Catch块与Try不同,因此$error自动变量将被重置且值为$null

答案 1 :(得分:0)

$ error和try / catch是PowerShell中不同的野兽。

try / catch捕获终止错误,但不会捕获Write-Error(导致它不终止)。

$ error是遇到的所有错误的列表(包括在使用-ErrorAction silentntlycontinue时吞下的错误)。

$ _是try / catch块中的当前错误。

我猜你的底层函数调用Write-Error,你希望它干净利落地进入try / catch。要使这也成为终止错误,请使用-ErrorAction Stop。