Powershell error try / catch no volver a lanzar la propagación (PowerShell 2.0)

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

  •  10-10-2019
  •  | 
  •  

Pregunta

Me tiene declaración try-catch dentro de una sentencia try-catch. La captura interno captura el error, pero el tiro no causa el error de quedar atrapado en la sentencia catch a cabo. Breifly, mi guión tiene el formato similar 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
     }
}

Cuando me encontré con la secuencia de comandos no hubo errores, pero me di cuenta de la base de datos de SQL Server que yo estaba tratando de poblar estaba datos que faltan. Cuando me re-corrió en el guión de depuración, la función 'putStuffInDB' tenía un error que fue capturado en el bloque catch. Pero cuando entré el mensaje no consigue 'tirado' al bloque catch exterior, pero procesa el bloque finally y terminado.

Obviamente estoy perdiendo algo que no estoy viendo. He utilizado el constructo en C # en el pasado y nunca tuvo problemas con ser errores 'pasado' al bloque catch exterior.

¿Fue útil?

Solución 3

Me dio cuenta de que el problema era de mi propia obra. En las funciones de POSH para crear las entradas SQLServer volví la clave primaria del conjunto de datos creado. El diseño de las funciones era tal que la función devolvería la clave principal. El error de diseño fue que puse una instrucción de retorno en el bloque finally, que superada la parte posterior a la captura tiro exterior. He cambiado el diseño de la eliminación de la instrucción de retorno. El try / catch ahora funciona correctamente.

Otros consejos

No estoy viendo que el comportamiento. Me encontré con el siguiente en PowerShell ISE y produce los resultados esperados. ¿Es posible que los errores en la base de datos no eran, de hecho, tirado como excepciones? Creo en SQL Server, por ejemplo, ciertos errores bajo un nivel de error dado no se tiran como excepciones al proveedor 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 los siguientes:

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

La variable que desea establecer es $ ErrorActionPreference, no ErrorPreference $.

(Josh se establece la variable de la derecha.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top