Question

J'ai une instruction try-catch dans une instruction try-catch. La prise intérieure attire l'erreur, mais le lancer ne provoque pas l'erreur d'être pris dans la déclaration de capture out. Breifly, mon script est formaté similaire à:

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

Quand je courais le script il n'y avait pas d'erreurs, mais j'ai remarqué la base de données SQL Server que je tentais de renseigner était les données manquantes. Quand je re-couru le script dans le débogage, la fonction « putStuffInDB » avait une erreur qui a été pris dans le bloc catch. Mais quand je suis le message ne se mettaient pas « jeté » au bloc catch externe, mais a traité le bloc finally et terminé.

Je manque évidemment quelque chose que je ne vois pas. Je l'ai utilisé la construction en C # dans le passé et n'a jamais eu des problèmes avec des erreurs étant « passé » au bloc catch externe.

Était-ce utile?

La solution 3

Je compris que le problème était de mon propre fait. Dans les fonctions de POSH pour créer les entrées de SQLServer je suis retourné la clé primaire de l'ensemble de données créé. La conception des fonctions était telle que la fonction retournerait la clé primaire. L'erreur de conception est que je mets une déclaration de retour dans le bloc finally qui supplantée l'arrière de jeter à la prise extérieure. J'ai changé la conception de retirer la déclaration de retour. Le try / catch fonctionne correctement.

Autres conseils

Je ne vois pas ce comportement. J'ai couru la suivante dans PowerShell ISE et produit les résultats escomptés. Est-il possible que les erreurs dans la base de données ne sont pas, en fait, jeté comme des exceptions? Je crois que dans SQL Server par exemple, certaines erreurs sous un niveau d'erreur donné ne sont pas jetés comme des exceptions au fournisseur de 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

Produit comme suit:

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

La variable que vous voulez régler $ ErrorActionPreference, pas ErrorPreference $.

(Josh avait mis la variable à droite.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top