使用 PowerShell 命令行时未捕获异常,但在使用 PowerShell ISE 时按预期捕获异常

Exception not caught when using PowerShell command line but caught as expected when using PowerShell ISE

提问人:gerard 提问时间:11/11/2014 更新时间:11/12/2014 访问量:1122

问:

我正在运行 PowerShell 2.0。

我有一个 PowerShell 脚本,该脚本将记录添加到数据库并返回所添加记录的 ID。 记录 ID 作为在 DataRow 对象中调用的属性返回(称为 )。new_deal_idResultSet

如果数据库端出现问题,则该属性可能未设置,或者根本不存在。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 命令行不会捕获异常?

PowerShell PowerShell-2.0

评论

0赞 Paul 11/11/2014
这确实很奇怪。ISE 使用不同的配置文件运行,也许其中有一些东西可以解释该行为(但无法在 v4 中重现)。您的 ise 配置文件可能已启用严格模式。您可以使用它在控制台中启用它。如果这不能产生你想要的结果,你可以通过检查属性的存在来解决它set-strictmodeget-member
0赞 silent 11/11/2014
你有没有试过添加到你的陈述中?这应该会将错误抛给 catch 子句。我不太确定为什么它对你来说表现得不同。-ErrorAction Stop
0赞 gerard 11/11/2014
@Paul。我应该在原始问题描述中提到,严格模式是在脚本的开头设置的。我也不知道它是否相关,但此代码包含在模块中。Set-StrictMode -Version latest
0赞 gerard 11/11/2014
@silent。将 $ErrorActionPreference 变量设置为“Stop”等同于在 CmdLet 中使用该命令。因此,如果发生任何错误,代码应停止并跳转到 catch 块。-ErrorAction Stop
0赞 gerard 11/11/2014
@Paul。嗨,保罗。使用 get-member CmdLet 没有帮助,但你提到的更严格让我思考。当我在命令行上通过脚本进行调试并在测试属性是否存在之前启用严格模式时,我得到了预期的异常。因此,看起来我在主脚本中设置的严格模式没有传递给模块中的函数。我不确定为什么会这样。无论哪种方式,它都解决了我的问题。你想添加你的评论作为答案,我会接受的。感谢您的帮助。

答:

1赞 Paul 11/12/2014 #1

这可能是因为您没有在运行脚本的控制台中启用严格模式。(Powershell 和 ISE 使用不同的配置文件)

若要启用严格模式,请使用 cmdlet。Set-Strictmode

例:

Set-StrictMode -Version latest

评论

0赞 gerard 11/12/2014
严格模式在主脚本中设置,但不会传递给单独模块中的函数。正如 Paul 所建议的:完整的解决方案是在测试属性是否存在之前,在函数中再次设置严格模式。