【问题标题】:Powershell try/catch rethrow not propagating error (Powershell 2.0)Powershell tr​​y/catch rethrow 不传播错误(Powershell 2.0)
【发布时间】:2010-12-16 02:07:14
【问题描述】:

我在 try-catch 语句中有一个 try-catch 语句。内部catch 捕获错误,但throw 不会导致错误在out catch 语句中被捕获。 Breifly,我的脚本格式类似于:

$ErrorPreference = "Stop"

try
{
     getStuffFromDB

     putStuffInDB
}
catch
{
     write-host ("Error: " + $error[0])
}

function getStuffFromDB
{
     try
     {
          -- database query statement
     }
     catch
     {
          throw
     }
     finally
     {
          close connection and clean up
     }
}

function putStuffInDB
{
     try
     {
          -- database insert statements statement
     }
     catch
     {
          throw
     }
     finally
     {
          close connection and clean up
     }
}

当我运行脚本时没有错误,但我注意到我试图填充的 SQL Server 数据库缺少数据。当我在调试中重新运行脚本时,函数“putStuffInDB”有一个错误,在 catch 块中被捕获。但是当我踩到消息时,消息并没有被“抛出”到外部 catch 块,而是处理了 finally 块并终止。

我显然错过了一些我没有看到的东西。我过去在 C# 中使用过该构造,并且从未遇到过将错误“传递”到外部 catch 块的问题。

【问题讨论】:

    标签: powershell rethrow


    【解决方案1】:

    我没有看到这种行为。我在 PowerShell ISE 中运行了以下命令,它产生了预期的结果。数据库中的错误是否可能实际上没有作为异常抛出?例如,我相信 SQL Server,给定错误级别下的某些错误不会作为异常返回给 ADO.NET 提供程序。

    $ErrorActionPreference = 'Stop'
    
    function Throw1 {
        try {
            Write-Host "Throw1.Try"
            throw "Error from Throw1"
        }
        catch { 
            Write-Host "Throw1.Catch"
            throw
        }
        finally {
            Write-Host "Throw1.Finally"
        }
    }
    
    function Throw2 {
        try {
            Write-Host "Throw2.Try"
            throw "Error from Throw2"
        }
        catch {
            Write-Host "Throw2.Catch"
            throw
        }
        finally {
            Write-Host "Throw2.Finally"
        }
    }
    
    function Test {
        try {
            Throw1
            Throw2
        }
        catch {
            Write-Host $error[0]
        }
    }
    
    Test
    

    产生以下内容:

    Throw1.Try
    Throw1.Catch
    Throw1.Finally
    Error from Throw1
    

    【讨论】:

    • 您对 SQL Server 严重性级别的评论可能与此有关,但目前尚不清楚。但是,内部的 catch 块确实会捕获错误并重新抛出它。没有捕获错误的是 out catch 块。作为测试,在我的插入语句中,我拼错了一个列名,它应该产生足够高的严重性级别,但仍然没有被外部捕获。
    • 你运行了我的脚本吗?在我的机器上,它按预期的顺序执行。我不确定您的情况还有什么不同。
    【解决方案2】:

    您要设置的变量是 $ErrorActionPreference,而不是 $ErrorPreference。

    (Josh 确实设置了正确的变量。)

    【讨论】:

    • 我做了那个更正,但没有帮助。虽然我不这么认为,但我在一个 ps1 文件中有一个主应用程序,并且数据库接口在单独的脚本文件中。我的理解是 $ErrrrorActionPreference 规范应该适用于主应用程序调用的所有脚本。所以据我所知,这个结构不应该改变 try/catch 的动作。
    【解决方案3】:

    我意识到问题出在我自己身上。在创建 SQLServer 条目的 POSH 函数中,我返回了创建的数据集的主键。函数的设计使得函数将返回主键。设计错误是我在 finally 块中放置了一个 return 语句,它取代了对外部 catch 的 throw。我已经更改了设计,删除了 return 语句。 try/catch 现在可以正常工作了。

    【讨论】:

      猜你喜欢
      • 2011-10-10
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多