Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell尝试/捕获重试未传播错误(Powershell 2.0)_Powershell_Rethrow - Fatal编程技术网

Powershell尝试/捕获重试未传播错误(Powershell 2.0)

Powershell尝试/捕获重试未传播错误(Powershell 2.0),powershell,rethrow,Powershell,Rethrow,我在try-catch语句中有一个try-catch语句。内部catch捕获错误,但抛出不会导致在out catch语句中捕获错误。Breifly,我的脚本的格式类似于: $ErrorPreference = "Stop" try { getStuffFromDB putStuffInDB } catch { write-host ("Error: " + $error[0]) } function getStuffFromDB { try

我在try-catch语句中有一个try-catch语句。内部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数据库缺少数据。在调试中重新运行脚本时,函数“puttuffindb”出现了一个错误,该错误在catch块中被捕获。但是当我步进时,消息没有被“抛出”到外部catch块,而是处理finally块并终止


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

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


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

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

我做了更正,但没有帮助。虽然我不这么认为,但我在一个ps1文件中有一个主应用程序,数据库接口在单独的脚本文件中。我的理解是$errorActionPreference规范应适用于主应用程序调用的所有脚本。据我所知,此结构不应改变try/catch的操作。您关于SQL Server严重性级别的评论可能与此有关,尽管目前尚不清楚。但是,内部catch块确实捕获了错误并将其重新引用。是out catch块没有捕获错误。作为测试,我在insert语句中拼错了一个列名,该列名应生成足够高的严重性级别,但仍然没有被外部捕获。您运行了我的脚本吗?在我的机器上,它按预期的顺序执行。我不确定你的情况还有什么不同。