Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Descripción breve
Describe cómo usar los bloques try, catchy finally para controlar los errores de terminación.
Descripción larga
Use trybloques , catchy finally para responder o controlar errores de terminación en scripts. La instrucción trap también se puede usar para controlar los errores de terminación en los scripts. Para obtener más información, vea about_Trap.
Un error de terminación impide que se ejecute una instrucción. Si PowerShell no controla un error de terminación de alguna manera, PowerShell también deja de ejecutar la función o script mediante la canalización actual. En otros lenguajes, como C#, los errores de terminación se conocen como excepciones.
Use el bloque try para definir una sección de un script en el que desea que PowerShell supervise si hay errores. Cuando se produce un error dentro del bloque try, el error se guarda primero en la variable automática $Error. A continuación, PowerShell busca un bloque de catch para controlar el error. Si la instrucción try no tiene un bloque de catch coincidente, PowerShell continúa buscando un bloque de catch adecuado o una instrucción trap en los ámbitos primarios. Una vez completado un bloque catch o si no se encuentra ninguna instrucción catch o trap adecuada, se ejecuta el bloque finally. Si no se puede controlar el error, el error se escribe en la secuencia de errores.
Un bloque catch puede incluir comandos para realizar el seguimiento del error o para recuperar el flujo esperado del script. Un bloque catch puede especificar qué tipos de error detecta. Una instrucción try puede incluir varios bloques de catch para diferentes tipos de errores.
Un bloque finally se puede usar para liberar los recursos que ya no necesite el script.
try, catchy finally se asemejan a las palabras clave try, catchy finally usadas en el lenguaje de programación de C#.
Syntax
Una instrucción try contiene un bloque de try, cero o más bloques de catch y cero o uno finally bloque. Una instrucción try debe tener al menos un bloque catch o un bloque finally.
A continuación se muestra la sintaxis de bloque try:
try {<statement list>}
La palabra clave try va seguida de una lista de instrucciones entre llaves. Si se produce un error de terminación mientras se ejecutan las instrucciones de la lista de instrucciones, el script pasa el objeto de error del bloque try a un bloque de catch adecuado.
A continuación se muestra la sintaxis de bloque catch:
catch [[<error type>][',' <error type>]*] {<statement list>}
Los tipos de error aparecen entre corchetes. Los corchetes más externos indican que el elemento es opcional.
La palabra clave catch va seguida de una lista opcional de especificaciones de tipo de error y una lista de instrucciones. Si se produce un error de terminación en el bloque try, PowerShell busca un bloque catch adecuado. Si se encuentra una, se ejecutan las instrucciones del bloque catch.
El bloque catch puede especificar uno o varios tipos de error. Un tipo de error es una excepción de Microsoft .NET Framework o una excepción derivada de una excepción de .NET Framework. Un bloque catch controla los errores de la clase de excepción de .NET Framework especificada o de cualquier clase que derive de la clase especificada.
Si un bloque catch especifica un tipo de error, ese bloque catch controla ese tipo de error. Si un bloque catch no especifica un tipo de error, ese bloque catch controla cualquier error encontrado en el bloque try. Una instrucción try puede incluir varios bloques de catch para los distintos tipos de error especificados.
A continuación se muestra la sintaxis de bloque finally:
finally {<statement list>}
La palabra clave finally va seguida de una lista de instrucciones que se ejecuta cada vez que se ejecuta el script, incluso si la instrucción try se ejecutó sin error o se detectó un error en una instrucción catch.
Tenga en cuenta que al presionar CTRL+C detiene la canalización. Los objetos que se envían a la canalización no se mostrarán como salida. Por lo tanto, si incluye una instrucción que se va a mostrar, como "Finally block has run", no se mostrará después de presionar CTRL+C, incluso si se ejecutó el bloque finally.
Almacenamiento en caché de los errores
El siguiente script de ejemplo muestra un bloque de try con un bloque catch:
try { NonsenseString }
catch { "An error occurred." }
La palabra clave catch debe seguir inmediatamente el bloque try u otro bloque catch.
PowerShell no reconoce "NonsenseString" como cmdlet u otro elemento. Al ejecutar este script, se devuelve el siguiente resultado:
An error occurred.
Cuando el script encuentra "NonsenseString", provoca un error de terminación. El bloque catch controla el error ejecutando la lista de instrucciones dentro del bloque .
USO DE VARIAS INSTRUCCIONES CATCH
Una instrucción try puede tener cualquier número de bloques de catch. Por ejemplo, el siguiente script tiene un bloque try que descarga MyDoc.docy contiene dos bloques catch:
try {
$wc = New-Object System.Net.WebClient
$wc.DownloadFile("https://httpbin.org/MyDoc.doc","C:\temp\MyDoc.doc")
} catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from https://httpbin.org."
} catch {
"An error occurred that could not be resolved."
}
El primer bloque catch controla los errores de los System.Net.WebException y tipos de System.IO.IOException. El segundo bloque catch no especifica un tipo de error. El segundo bloque catch controla cualquier otro error de terminación que se produzca.
PowerShell coincide con los tipos de error por herencia. Un bloque catch controla los errores de la clase de excepción de .NET Framework especificada o de cualquier clase que derive de la clase especificada. El ejemplo siguiente contiene un bloque catch que detecta un error "Comando no encontrado":
catch [System.Management.Automation.CommandNotFoundException] {
"Inherited Exception"
}
El tipo de error especificado, CommandNotFoundException, hereda del tipo System.SystemException. En el ejemplo siguiente también se detecta un error Command Not Found:
catch [System.SystemException] {"Base Exception" }
Este bloque catch controla el error "Comando no encontrado" y otros errores que heredan del tipo de SystemException de.
Si especifica una clase de error y una de sus clases derivadas, coloque el bloque catch para la clase derivada antes del bloque catch para la clase general.
Nota
PowerShell encapsula todas las excepciones de un tipo runtimeException de. Por lo tanto, especificar el tipo de error System.Management.Automation.RuntimeException se comporta igual que un bloque catch no calificado.
Uso de trampas en un try catch
Cuando se produce un error de terminación en un bloque de try con un trap definido dentro del bloque try, incluso si hay un bloque de catch coincidente, la instrucción trap toma el control.
Si existe un trap en un bloque superior al try, y no hay ningún bloque catch coincidente dentro del ámbito actual, el trap tomará el control, incluso si algún ámbito primario tiene un bloque de catch coincidente.
Acceso a la información de excepciones
Dentro de un catch bloque, se puede acceder al error actual mediante la $_ variable o $PSItem automática. El objeto es de tipo ErrorRecord.
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_
}
Al ejecutar este script, se devuelve el siguiente resultado:
An Error occurred:
The term 'NonsenseString' is not recognized as the name of a cmdlet, function,
script file, or operable program. Check the spelling of the name, or if a path
was included, verify that the path is correct and try again.
Hay propiedades adicionales a las que se puede acceder, como ScriptStackTrace, Exceptiony ErrorDetails. Por ejemplo, si cambiamos el script a lo siguiente:
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_.ScriptStackTrace
}
El resultado será similar a:
An Error occurred:
at <ScriptBlock>, <No file>: line 2
Liberar recursos mediante finalmente
Para liberar recursos usados por un script, agregue un bloque de finally después de los bloques try y catch. Las instrucciones de bloque finally se ejecutan independientemente de si el bloque try encuentra un error de terminación. PowerShell ejecuta el bloque finally antes de que finalice el script o antes de que el bloque actual salga del ámbito.
Un bloque de finally se ejecuta incluso si usa CTRL+C para detener el script. Un bloque finally también se ejecuta si una palabra clave exit detiene el script desde un bloque de catch.
En el ejemplo siguiente, el bloque try intenta descargar un archivo en la carpeta C:\temp. Los bloques catch controlan los errores que se producen durante la descarga. El bloque finally elimina el objeto WebClient y quita el archivo temporal si existe.
try {
$wc = New-Object System.Net.WebClient
$tempFile = "C:\temp\MyDoc.doc"
$wc.DownloadFile("https://httpbin.org/MyDoc.doc",$tempFile)
} catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from https://httpbin.org."
} catch {
"An error occurred that could not be resolved."
} finally {
$wc.Dispose()
if (Test-Path $tempPath) { Remove-Item $tempFile }
}