【发布时间】:2014-11-10 17:44:36
【问题描述】:
我正在运行 PowerShell 2.0。
我有一个 PowerShell 脚本,可以将记录添加到数据库并返回添加的记录的 ID。
记录 ID 作为 DataRow 对象(称为 ResultSet)内称为 new_deal_id 的属性返回。
如果数据库端出现问题,new_deal_id 属性可能没有设置,或者根本不存在。
为了应对这种情况,我将属性的读取包装在一个 try/catch 块中,如下所示。
try {
$ErrorActionPreference = "Stop"
$ResultSet = Read-DatabaseData -OdbcCommand $OdbcCommand -SqlQuery $Sql
$NewDealID = $ResultSet.new_deal_id
}
catch {
throw
}
finally {
$ErrorActionPreference = "Continue"
}
如果我使用 PowerShell ISE 或 PowerGui 运行脚本,则会在属性不存在时捕获下面显示的异常
Property 'new_deal_id' cannot be found on this object. Make sure that it exists.
At line:1 char:12
+ $ResultSet. <<<< newdeal
+ CategoryInfo : InvalidOperation: (.:OperatorToken) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : PropertyNotFoundStrict
但是,如果我从 PowerShell 命令行运行脚本,则不会捕获异常,并且脚本会继续运行,就像没有发生错误一样。
为什么当属性不存在时 PowerShell 命令行没有捕捉到异常?
【问题讨论】:
-
这确实很奇怪。 ise 使用不同的配置文件运行,也许其中有一些东西可以解释这种行为(虽然无法在 v4 中重现)。可能您的 ise 配置文件启用了严格模式。您可以使用
set-strictmode在控制台中启用它。如果这没有产生您想要的结果,您可以通过使用get-member检查属性的存在来解决它 -
您是否尝试将
-ErrorAction Stop添加到您的声明中?这应该将错误抛出到您的 catch 子句。我不太确定为什么它对你的行为不同。 -
@保罗。我应该在原始问题描述中提到,在脚本开头使用
Set-StrictMode -Version latest设置了严格模式。另外我不知道它是否相关,但此代码包含在模块中。 -
@silent。将 $ErrorActionPreference 变量设置为“Stop”相当于在 CmdLet 中使用
-ErrorAction Stop命令。因此,如果发生任何错误,代码应该停止并跳转到 catch 块。 -
@保罗。嗨,保罗。使用 get-member CmdLet 并没有帮助,但您提到的 strict more 让我思考。当我通过命令行上的脚本进行调试并在测试属性是否存在之前启用严格模式时,我得到了预期的异常。所以看起来我在主脚本中设置的严格模式没有传递给模块内的函数。我不确定为什么会这样。无论哪种方式,它都解决了我的问题。你想添加你的评论作为答案,我会接受。感谢您的帮助。