Domanda

Ho un try-catch all'interno di un'istruzione try-catch. Il fermo interno cattura l'errore, ma il tiro non causa l'errore di essere catturati nella dichiarazione fuori cattura. Breifly, il mio script è formattato simile a:

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

Quando ho eseguito lo script non ci sono stati errori, ma ho notato che il database di SQL Server che stavo cercando per popolare era dati mancanti. Quando ho ri-corse lo script in di debug, la funzione 'putStuffInDB' avevano presentato un errore che è stato catturato nel blocco catch. Ma quando ho fatto un passo il messaggio non ha ottenuto 'gettato' al blocco catch esterno, ma elaborato il blocco finally e terminato.

Sono ovviamente manca qualcosa che io non sto vedendo. Ho usato il costrutto in C # in passato e mai avuto problemi con gli errori di essere 'passato' al blocco catch esterno.

È stato utile?

Soluzione 3

mi sono reso conto che il problema era del mio proprio fare. Nelle funzioni POSH per creare le voci di SQLServer sono tornato la chiave primaria del set di dati creata. La progettazione delle funzioni era tale che la funzione restituirebbe la chiave primaria. L'errore di progettazione è stato che ho messo l'istruzione return nel blocco finally che soppiantata retro tiro al pescato esterno. Ho cambiato il design di rimuovere l'istruzione return. Il try / catch ora funziona correttamente.

Altri suggerimenti

Io non sto vedendo che il comportamento. Ho eseguito il seguente in PowerShell ISE e produce i risultati attesi. E 'possibile che gli errori nel database non sono stati infatti gettati come eccezioni? Credo in SQL Server, ad esempio, alcuni errori sotto di un determinato livello di errore non sono gettati come eccezioni indietro al provider 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

produce il seguente:

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

La variabile che si desidera impostare è $ ErrorActionPreference, non $ ErrorPreference.

(Josh ha definito la variabile a destra).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top