我在一个try-catch语句中有一个try-catch语句。内部捕获会捕获错误,但投掷并没有导致错误在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”的错误在捕获块中捕获了一个错误。但是,当我登上消息时,没有“扔”到外部捕获块上,而是处理了最后的块并终止。

我显然缺少我没有看到的东西。我过去曾在C#中使用过该结构,但从未遇到过错误的问题,即“传递”到外部捕获块。

有帮助吗?

解决方案 3

我意识到问题是我自己的事情。在创建SQLSERVER条目的POSH函数中,我返回了创建的数据集的主要键。功能的设计使得该函数将返回主键。设计错误是我在最后的块中放了一个返回声明,将投掷倒流到了外部捕获量。我更改了删除返回语句的设计。尝试/捕获现在正常工作。

其他提示

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

您要设置的变量是$ erroractionPreference,而不是$ errorPreference。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top