Windows PowerShell Scripts: Errors handling
February 7, 2007 — emoritoTrabajando sobre unos scripts de PowerShell para testear la funcionalidad de unos assemblies, tenia que encontrar la forma de manajear los errores en PowerShell. Encontre este post y este capitulo Error Handling and Debugging del libro de Jones & Hicks sobre PowerShell.
Segui este post y lei el capitulo Error Handling and Debugging para entender como PowerShell maneja los errores.
En base a esto, implemente el trap handler en los scripts para manejar todos los errores:
trap {
write-host "An error occured: "
write-host "Message: " $_.Exception.Message
throw
}
Pero esto, solamente maneja los errores producidos por los cmdlets (Command Lets). En mi caso tambien se queria manejar los errores que puedan surgir al invocar metodos del assembly.
Esta es la parte del script en donde si hay un error el trap no lo agarra:
$da = new-object Restaurants.DataAccess.Queries.RestaurantQueries "Data Source=.\SQLEXPRESS;Initial Catalog=DinnerNow;Integrated Security=True"
$rest = $da.GetRestaurant("7a56fe1b-c516-4e6e-8f75-339bb25a634d")
Si ejecutamos el script y el metodo al que se llama no esta implementado, por ejemplo, el script falla pero sigue ejecutandose.
Figura 1: Se puede observar que ha ocurrido un error y el script termina su ejecucion sin tener en cuenta este.
Para resolver esto, preguntamos si el metodo existe y utilizamos el Command Let write-error para setearle un mensaje al error y la accion a ejecutar:
$da = new-object Restaurants.DataAccess.Queries.RestaurantQueries "Data Source=.\SQLEXPRESS;Initial Catalog=DinnerNow;Integrated Security=True"
if ($da.GetRestaurant)
{
$rest = $da.GetRestaurant("7a56fe1b-c516-4e6e-8f75-339bb25a634d")
}
else
{
write-error -message "Cannot find method GetRestaurant" - ErrorAction Stop
}
De esta manera el trap agarra el error y se puede setear para que el script pare la ejecucion.
Figura 2: Se puede observar que se informa que ha ocurrido un error y el script ha detenido su ejecucion.