[英]Powershell try/catch rethrow not propagating error (Powershell 2.0)
我在try-catch语句中有一个try-catch语句。 内部catch捕获错误,但是throw不会导致错误被out捕获语句捕获。 简而言之,我的脚本的格式类似于:
$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块的问题。
我没有看到这种行为。 我在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。
(Josh确实设置了正确的变量。)
我意识到问题出在我自己身上。 在创建SQLServer条目的POSH函数中,我返回了所创建数据集的主键。 函数的设计使得函数将返回主键。 设计上的错误是,我在finally块中放置了一个return语句,该语句取代了将抛出返回到外部捕获的过程。 我更改了设计,删除了return语句。 尝试/捕获现在可以正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.