PowerShell Try/Catch Rethrow не распространяю ошибку (PowerShell 2.0)

StackOverflow https://stackoverflow.com/questions/4456863

  •  10-10-2019
  •  | 
  •  

Вопрос

У меня есть заявление о промежутке в рамках оператора 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 я вернул первичный ключ созданного набора данных. Конструкция функций была такова, что функция возвращает первичный ключ. Ошибка дизайна заключалась в том, что я поместил ответный заявление в наконец -то блок, который засунул бросок обратно в внешний улов. Я изменил дизайн, удалив оператор возврата. 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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top