Powershell尝试/捕获重试未传播错误(Powershell 2.0)
我在try-catch语句中有一个try-catch语句。内部catch捕获错误,但抛出不会导致在out catch语句中捕获错误。Breifly,我的脚本的格式类似于: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
$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语句中拼错了一个列名,该列名应生成足够高的严重性级别,但仍然没有被外部捕获。您运行了我的脚本吗?在我的机器上,它按预期的顺序执行。我不确定你的情况还有什么不同。