Frage

habe ich eine Try-catch-Anweisung innerhalb einer try-catch-Anweisung. Der innere fangen fängt den Fehler, aber der Wurf verursacht nicht der Fehler in der catch-Anweisung heraus gefangen werden. Breifly, mein Skript ist so formatiert, ähnlich wie:

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

Als ich das Drehbuch lief es keine Fehler aufgetreten waren, aber ich merkte, die SQL Server-Datenbank, dass ich zu bevölkern versuchten war fehlende Daten. Als ich wieder lief das Skript im Debug, die Funktion ‚putStuffInDB‘ hatte einen Fehler, der in dem catch-Block gefangen wurde. Aber wenn ich die Nachricht trat nicht bekommen ‚geworfen‘ an den äußeren catch-Block, sondern verarbeitet die schließlich blockieren und beendet.

Ich vermisse natürlich etwas, dass ich sehe nicht. Ich habe das Konstrukt in C # in der Vergangenheit verwendet und habe nie Probleme mit Fehlern ‚bestanden‘ an den äußeren catch-Block zu sein.

War es hilfreich?

Lösung 3

wurde mir klar, dass das Problem meines eigenen Tuns war. In den POSH Funktionen, um die SQL Server-Einträge erstellen kehrte ich den Primärschlüssel des Datensatzes erstellt. Die Gestaltung der Funktionen war, so dass die Funktion der Primärschlüssel zurückkehren würde. Das Design Fehler war, dass ich eine return-Anweisung in dem finally-Block setzen, die den Ball zurück an den äußeren Haken abgelöst. Ich habe das Design Entfernen der return-Anweisung geändert. Der Try / Catch funktioniert jetzt korrekt.

Andere Tipps

Ich sehe nicht, dass das Verhalten. Ich lief die folgende in Powershell ISE und produziert die erwarteten Ergebnisse. Ist es möglich, dass die Fehler in der Datenbank als Ausnahmen in der Tat nicht geworfen wurden? Ich glaube, in SQL Server beispielsweise bestimmte Fehler unter einer gegebenen Fehlerebene nicht geworfen als Ausnahme von den ADO.NET-Provider zurück.

$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

Erzeugt die folgenden:

Throw1.Try
Throw1.Catch
Throw1.Finally
Error from Throw1

Die Variable, die Sie setzen wollen ist $ ErrorActionPreference, nicht $ ErrorPreference.

(Josh die richtige Variable gesetzt hat.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top