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.
(Джош установил правильную переменную.)