Powershell尝试/捕获重新抛出而不是传播错误(Powershell 2.0)

时间:2010-12-16 02:07:15

标签: powershell rethrow

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

$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数据库是缺少数据。当我在debug中重新运行脚本时,函数'putStuffInDB'出现了catch块中捕获的错误。但当我步进消息时,没有被“抛出”到外部catch块,但是处理了finally块并终止了。

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

3 个答案:

答案 0 :(得分:3)

我没有看到这种行为。我在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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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