PowerShell Try/Catch Rethrow не распространяю ошибку (PowerShell 2.0)
-
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.
(Джош действительно установил правильную переменную.)