HOWTO · PowerShell

Cómo manejar errores usando el bloque Try-Catch en PowerShell

Este artículo analizará las preferencias de acción de error en PowerShell y cómo podemos interceptarlas para realizar el manejo de errores usando los bloques Try Catch y Finally de PowerShell.

En esta página

En PowerShell, try y catch manejan los errores de terminación. Muchos cmdlets informan de errores como no terminantes, así que añada -ErrorAction Stop cuando el fallo de una operación deba llegar a un bloque catch. $ErrorActionPreference establece el manejo predeterminado de los errores no terminantes en su ámbito, mientras que -ErrorAction establece el comportamiento para un solo comando.

la variable $ErrorActionPreference en PowerShell

$ErrorActionPreference controla cómo responde PowerShell a los errores no terminantes en su ámbito. Su valor predeterminado es Continue: PowerShell informa del error y continúa con la siguiente instrucción. Establecerlo en Stop convierte los errores no terminantes en errores de terminación, de modo que pueden interrumpir el flujo actual y ser manejados por un catch circundante. Después de que un catch maneja un error, la ejecución sigue el flujo de control circundante; un error no finaliza automáticamente todo el script.

Use un cambio limitado a un ámbito cuando solo una parte de un script necesite este comportamiento. Guarde el valor anterior y restáurelo en un bloque finally si los comandos posteriores deben usar la configuración anterior. Esta preferencia se aplica a los comandos que respetan las preferencias de acción de error de PowerShell, y no sustituye el manejo explícito de cada tipo de fallo.

el parámetro común ErrorAction en PowerShell

-ErrorAction es un parámetro común compatible con muchos cmdlets y funciones. Su valor se aplica a ese comando y tiene prioridad sobre $ErrorActionPreference para esa invocación. Por ejemplo, Get-Content $path -ErrorAction Stop convierte un error de lectura no terminante en un error de terminación para ese comando. Un catch circundante puede entonces manejarlo. El parámetro cambia cómo se maneja el error del comando; la lógica de recuperación pertenece al script circundante.

Los valores incluyen Continue y Stop, junto con acciones como SilentlyContinue, Ignore, Inquire y Suspend cuando son compatibles. Prefiera -ErrorAction Stop en la operación cuyo fallo debe capturarse en lugar de cambiar un ámbito más amplio. Los comandos también pueden producir errores de terminación independientemente de esta configuración.

Utilice el bloque try-catch de PowerShell

Coloque las instrucciones que pueden fallar en try. Un error de terminación transfiere el control a un catch coincidente; un catch sin tipo maneja cualquier error de terminación, mientras que una forma con tipo como catch [System.IO.IOException] maneja errores de ese tipo. Coloque los catches específicos antes de un catch general. $Error es la colección automática del historial de errores de PowerShell, no una variable que representa solo el fallo actual. Dentro de un bloque catch, $_ (también disponible como $PSItem) describe el registro de error actual; sus propiedades Exception o FullyQualifiedErrorId pueden ayudar con el diagnóstico.

Un bloque finally es opcional y se ejecuta cuando el control sale de la instrucción try, tanto si se completó con normalidad como si se manejó un error. Úselo para la limpieza, como liberar un recurso abierto antes de la operación. Un bloque catch puede recuperar, registrar o volver a lanzar un error; capturarlo no decide por sí solo si el script circundante debe continuar con su trabajo restante.

El siguiente ejemplo ejecutable sigue la ruta de éxito e imprime una línea de estado antes de su línea de limpieza. El código no tiene ninguna dependencia de archivos externos.

try {
    $reportName = "daily-report.txt"
    Write-Output "Prepared $reportName"
}
finally {
    Write-Output "Finished report step"
}
Prepared daily-report.txt
Finished report step

Para un cmdlet cuyo error no terminante debe capturarse, añada -ErrorAction Stop a ese cmdlet dentro de try. Mantenga las rutas y otras entradas explícitas en los scripts de producción y, a continuación, elija si registrar, reintentar, recuperar o volver a lanzar según la operación. El ejemplo muestra la ruta de éxito; adapte la misma estructura de flujo de control alrededor del comando cuyo fallo necesita manejar.