PowerShell尝试/捕获Rethrow不传播错误(PowerShell 2.0)
-
10-10-2019 - |
题
我在一个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。
(乔什确实设置了正确的变量。)
不隶属于 StackOverflow