PowerShell es una de las herramientas más potentes y versátiles para la automatización de tareas en entornos Windows. Sin embargo, como cualquier lenguaje de scripting, no está exento de errores y excepciones. Entender cómo se reportan, gestionan y controlan estos errores es fundamental para crear scripts robustos, claros y fáciles de depurar.
En este artículo vamos a sumergirnos de lleno en el mundo de los errores y excepciones en PowerShell. Aprenderás no solo a identificar correctamente los distintos tipos de errores, sino también a trabajar eficazmente con estructuras como Try/Catch/Finally, usar variables clave como $Error o $ErrorActionPreference, y dominar técnicas avanzadas como el lanzamiento y captura de excepciones con tipos específicos.
Errores en PowerShell: conceptos clave
Cuando usamos PowerShell, los errores forman parte del día a día en el desarrollo de scripts. Un error es básicamente cualquier condición inesperada que ocurre durante la ejecución del código. Pero no todos los errores son iguales ni se gestionan de la misma manera.
Podemos clasificar los errores en dos grandes tipos: errores de terminación (terminating errors) y errores que no detienen el script (non-terminating errors).
- Errores de terminación: son errores críticos que detienen inmediatamente la ejecución del script o cmdlet. Estos errores se pueden capturar usando estructuras
try/catch
. - Errores no fatales: no detienen el script. PowerShell simplemente los reporta en rojo, los guarda en
$Error
y continúa ejecutando el resto del código.
Por ejemplo, si tratas de acceder a un archivo que no existe, lo más habitual es que PowerShell informe del error pero continúe con el procesamiento, a menos que especifiques lo contrario. Para más información sobre cómo gestionar errores de forma avanzada, puedes visitar nuestro artículo sobre gestión de errores en PowerShell.
La variable $Error y cómo se utiliza
PowerShell mantiene un historial de errores en la variable automática $Error
, que actúa como una lista donde se almacenan todos los errores ocurridos durante la sesión.
Algunas claves sobre esta variable:
$Error
es siempre el error más reciente.- Contiene objetos de tipo ErrorRecord, no simplemente mensajes de texto.
- Máximo de 256 errores almacenados por defecto, configurable mediante
$MaximumErrorCount
.
Ejemplo de uso:
# Ver el último error
$Error
# Limpiar la lista de errores
$Error.Clear()
Debes tener en cuenta que, al ser una variable global, los errores de toda la sesión se almacenan aquí, no solo los de tu script. Por eso, es recomendable no depender excesivamente de ella o vaciarla si vas a trabajar con registros nuevos.
También puedes usar ErrorVariable como alternativa, que captura errores en variables específicas por cada cmdlet, sin afectar la global $Error
.
Parámetros y preferencias para controlar errores
PowerShell ofrece varias formas de decidir cómo deben comportarse los errores. Las dos más relevantes son:
- El parámetro
-ErrorAction
: puedes usarlo al llamar a un cmdlet para decidir cómo actuar en caso de error. - La variable global
$ErrorActionPreference
: configura la política general de errores para todo el entorno o script.
Los valores que puedes usar son:
- Continue (por defecto): Muestra el error y continúa la ejecución.
- SilentlyContinue: No muestra el error pero lo guarda en
$Error
. - Stop: Tratar errores como fatales y detener el script, permitiendo capturarlos con
try/catch
. - Inquire: Pregunta al usuario qué hacer.
- Ignore (desde PowerShell 3.0): Ignora completamente el error, no se guarda ni se muestra.
Ejemplo práctico:
$ErrorActionPreference = "Stop" # Todos los errores serán tratados como fatales
Get-ChildItem "C:\RutaInexistente" -ErrorAction SilentlyContinue
Esto nos da una flexibilidad brutal para decidir qué tipo de errores vale la pena interrumpir y cuáles no. Para más detalles sobre el manejo de errores en scripts, consulta nuestra guía sobre ejecución de scripts en PowerShell.
Uso de Try, Catch y Finally
A partir de PowerShell 2.0, podemos usar bloques try/catch/finally para capturar errores de forma estructurada.
Su sintaxis es la siguiente:
Try {
# Código que podría fallar
}
Catch {
# Código para manejar esa excepción
}
Catch {
# Código para manejar errores genéricos
}
Finally {
# Código que siempre se ejecuta al final, falle o no
}
El bloque Try ejecuta el código que potencialmente podría generar un error. Si ocurre uno de tipo fatal (terminating), saltamos al Catch correspondiente. Si no se especifica un tipo de excepción, se captura cualquier error.
El bloque Finally es opcional pero útil cuando necesitas liberar recursos, cerrar conexiones o hacer limpieza.
Ejemplo real:
Try {
Get-Content "C:\ArchivoInexistente.txt" -ErrorAction Stop
}
Catch {
Write-Error "No se pudo abrir el archivo: $($_.Exception.Message)"
}
Finally {
Write-Output "Finalizado"
}
Dentro del Catch puedes usar las variables automáticas $_
o $PSItem
para obtener detalles del error, como su mensaje, tipo, traza de pila, etc. Si deseas saber más sobre cómo mejorar los scripts y manejar excepciones específicas, revisa nuestro artículo sobre corrección de errores en Windows 10.
…
Manejar correctamente los errores en PowerShell es una de las habilidades clave para crear scripts profesionales y evitar que una tarea crítica se detenga por problemas menores. Dominar estructuras como Try/Catch/Finally, conocer las variables automáticas que PowerShell nos ofrece, y aprender a trabajar con excepciones tipadas son pasos fundamentales para mejorar la calidad de nuestro código.
Además, herramientas como Write-Error, combinadas con parámetros como -ErrorAction
, nos dan un control total sobre cuándo y cómo se deben mostrar los errores, permitiendo personalizarlos a detalle y contribuir a una mejor experiencia para quien ejecuta nuestros scripts.
Redactor apasionado del mundo de los bytes y la tecnología en general. Me encanta compartir mis conocimientos a través de la escritura, y eso es lo que haré en este blog, mostrarte todo lo más interesante sobre gadgets, software, hardware, tendencias tecnológicas, y más. Mi objetivo es ayudarte a navegar por el mundo digital de forma sencilla y entretenida.