Powershell try / catch rethrow не передает ошибку (Powershell 2.0) - PullRequest
1 голос
/ 16 декабря 2010

У меня есть оператор try-catch внутри оператора try-catch.Внутренний перехват перехватывает ошибку, но бросок не приводит к перехвату ошибки в операторе out catch.Вкратце, мой сценарий отформатирован так:

$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.

Ответы [ 3 ]

3 голосов
/ 16 декабря 2010

Я не вижу такого поведения. Я запустил следующее в 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
1 голос
/ 17 декабря 2010

Я понял, что проблема была в моих собственных делах.В функциях POSH для создания записей SQLServer я возвращал первичный ключ созданного набора данных.Дизайн функций был таким, что функция возвращала первичный ключ.Ошибка проекта заключалась в том, что я поместил оператор return в блок finally, который заменил бросок обратно на внешний улов.Я изменил дизайн, удалив заявление о возврате.Try / catch теперь работает правильно.

1 голос
/ 16 декабря 2010

Переменная, которую вы хотите установить - это $ ErrorActionPreference, а не $ ErrorPreference.

(Джош установил правильную переменную.)

...