Powershell $Error变量为$Null,但$\在Catch中包含错误

Powershell $Error变量为$Null,但$\在Catch中包含错误,powershell,error-handling,Powershell,Error Handling,我有一个PS模块,它包含许多用于单个函数的脚本。还有一个“库”脚本,其中包含许多辅助函数,这些函数由模块中使用的函数调用 让我们调用外部函数ReadWeb,它使用辅助函数ParseXML 本周,我在Internal helperParseXML函数中遇到了一个错误处理问题。该函数包含一个try/catch,在catch中我询问: $Error[0]。异常。内部异常。消息 …以便将错误作为变量传递回外部作用域,并确定ParseXML是否有效 对于一个特殊的情况,当我调用ReadWeb时,我得到了一

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

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

本周,我在Internal helper
ParseXML
函数中遇到了一个错误处理问题。该函数包含一个try/catch,在catch中我询问:

$Error[0]。异常。内部异常。消息

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

对于一个特殊的情况,当我调用
ReadWeb
时,我得到了一个索引错误。根本原因是
ParseXML
中的
Catch
块中的
$Error
对象正在返回
$Null

我将错误处理更改为检查
$error-eq$Null
,如果是,请使用
Catch
中的
$\ucode>确定错误消息是什么


我的问题是:是什么导致
$Error
Catch
中成为
$null

$Error和try/Catch在PowerShell中是不同的野兽

try/catch捕获终止错误,但不会捕获写入错误(因为它是非终止的)

$error是遇到的所有错误的列表(包括在使用-ErrorAction silentlycontinue时被吞没的错误)

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


我猜您的底层函数调用Write Error,您希望它完全进入try/catch。若要使其成为终止错误,请使用-ErrorAction Stop。

$error
是一个由Powershell处理的自动变量:中详细描述的第三个§

它被视为Catch块的上下文,因此可用作
$\uuu

由于Catch block与Try是不同的块,因此重置了
$error
自动变量并对其赋值
$null

您是否尝试将问题隔离到一个简化的测试用例中,您可以在此处发布?@Neolisk由于各种作用域中涉及的问题,我没有这样做。我有一个带有脚本文件的模块,该脚本文件调用另一个模块中的另一个函数,该模块调用库中的函数。好吧,它可以帮助您了解更多有关问题的信息-代码、类等等。现在听起来很奇怪,但仅此而已。如果有必要,我可以在今天晚些时候尝试添加更多细节。为这件事创建一个简化的案例是非常重要的。我理解。然而,在不知道任何细节的情况下给出答案也是很重要的不幸的是,根本没有设置ErrorAction,我尝试设置
$ErrorActionPreference
来检查这种行为。不过,我不确定在catch块中,
$Error
怎么可能是
$null
。如果我们在一个catch块中,不管怎样都会发生终止错误。