Powershell try/catch rethrow не распространяющая ошибка (Powershell 2.0)

У меня есть оператор 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 ответа

Решение

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

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

Другие вопросы по тегам