2

我在 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 块的问题。

4

3 回答 3

5

我没有看到这种行为。我在 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
于 2010-12-16T02:17:15.553 回答
1

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

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

于 2010-12-16T16:52:52.153 回答
1

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

于 2010-12-17T20:12:37.737 回答