我有PS模块,其中包含许多用于单个功能的脚本。还有一个“库”脚本,其中包含许多辅助函数,这些函数可以被模块中使用的函数调用。
让我们调用外部函数ReadWeb
,它使用辅助函数ParseXML
。
本周我在内部帮助器ParseXML
函数中遇到了错误处理问题。该函数包含一个try / catch,并在catch中查询:
$Error[0].Exception.InnerException.Message
...以将错误作为变量传递回外部作用域并确定ParseXML
是否有效。
对于特定情况,我在调用ReadWeb
时收到索引错误。根本原因是$Error
中Catch
块中的ParseXML
对象返回$Null
。
我更改了错误处理以检查$Error -eq $Null
,如果是,请使用$_
中的Catch
来确定错误消息。
我的问题是:导致$Error
$null
内的Catch
是什么?
答案 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。