TEMA
about_Try_Catch_Finally
DESCRIPCIÓN BREVE
Describe cómo se usan los bloques Try, Catch y Finally para
controlar los errores de terminación.
DESCRIPCIÓN DETALLADA
Utilice los bloques Try, Catch y Finally para responder a, o
controlar, los errores de terminación en scripts. La instrucción Trap
también se puede utilizar para controlar los errores de terminación
en scripts. Para obtener más información, vea about_Trap.
Un error de terminación detiene la ejecución de una instrucción.
Si Windows PowerShell no controla un error de terminación de
algún modo, también se detendrá la ejecución de la función o
script que está utilizando la canalización actual. En otros
lenguajes, como C#, los errores de terminación reciben el nombre de
excepciones. Para obtener más información sobre los errores, vea
about_Errors.
Utilice el bloque Try para definir una sección de un script en
que se desea que Windows PowerShell supervise los errores. Cuando
se produce un error dentro del bloque Try, se guarda primero en
la variable automática $Error. A continuación, Windows PowerShell
busca un bloque Catch para controlar el error. Si la instrucción
Try no tiene un bloque Catch correspondiente, Windows PowerShell
continúa buscando la instrucción Trap o el bloque Catch
apropiados en los ámbitos principales. Después de completarse un
bloque Catch o si no se encuentra ningún bloque Catch o
instrucción Trap apropiados, se ejecuta el bloque Finally. Si el
error no se puede controlar, se escribe en la secuencia de error.
Un bloque Catch puede incluir comandos para realizar el
seguimiento del error o para recuperar el flujo esperado del
script. Además, puede especificar qué tipos de error detecta. Una
instrucción Try puede incluir varios bloques Catch para diferentes
tipos de errores.
Un bloque Finally se puede utilizar para liberar los recursos que
el script ya no necesita.
Try, Catch y Finally son semejantes a las palabras clave Try, Catch y
Finally utilizadas en el lenguaje de programación C#.
Sintaxis
Una instrucción Try contiene un bloque Try, ninguno o varios
bloques Catch y ninguno o un bloque Finally. Además, debe tener
un bloque Catch o un bloque Finally por lo menos.
A continuación se muestra la sintaxis del bloque Try:
try {<lista de instrucciones>}
Una palabra clave Try va seguida de una lista de instrucciones entre
llaves. Si se produce un error de terminación mientras se están
ejecutando las instrucciones de la lista de instrucciones, el script
pasará el objeto de error del bloque Try a un bloque Catch adecuado.
A continuación se muestra la sintaxis del bloque Catch:
catch [[<tipo de error>][',' <error type>]*] {<lista de
instrucciones>}
Los tipos de error se muestran 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, Windows PowerShell
busca un bloque Catch adecuado. Si encuentra uno, se ejecutan las
instrucciones del citado bloque.
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 derivada de la clase especificada.
Si un bloque Catch especifica un tipo de error, controla ese
tipo de error. Si un bloque Catch no especifica un tipo de
error, controla los errores encontrados en el bloque Try. Una
instrucción Try puede incluir varios bloques Catch para los
diferentes tipos de error especificados.
A continuación se muestra la sintaxis del bloque Finally:
finally {<lista de instrucciones>}
La palabra clave Finally va seguida de una lista de
instrucciones que se ejecuta cada vez que se ejecuta el script,
aunque la instrucción Try se haya ejecutado sin error o se haya
detectado un error en una instrucción Catch.
Observe que al presionar CTRL+C, se detiene la canalización.
Los objetos que se envían a la canalización no se mostrarán
como resultado. Por consiguiente, si incluye una instrucción
para que se muestre, como "El bloque Finally se ha ejecutado", no se
mostrará después de presionar CTRL+C, aunque se haya ejecutado el
bloque Finally.
Detectar errores
El script de ejemplo siguiente muestra un bloque Try con un
bloque Catch:
try { CadenaSinSentido }
catch { "Se ha producido un error." }
La palabra clave Catch debe seguir inmediatamente al bloque Try
o a otro bloque Catch.
Windows PowerShell no reconoce "CadenaSinSentido" como cmdlet u otro
elemento. La ejecución de este script devuelve el resultado siguiente:
Se ha producido un error.
Cuando el script encuentra "CadenaSinSentido", se produce un
error de terminación. El bloque Catch controla el error
ejecutando la lista de instrucciones incluida en el bloque.
Usar varias instrucciones Catch
Una instrucción Try puede tener cualquier número de bloques
Catch. Por ejemplo, el script siguiente tiene un bloque Try que
descarga MyFile.doc y contiene dos bloques Catch:
try
{
$wc = new-object System.Net.WebClient
$wc.DownloadFile("https://www.contoso.com/MyDoc.doc") }
catch [System.Net.WebException],[System.IO.IOException] {
"No se puede descargar MyDoc.doc de http://www.contoso.c
om." }
catch
{
"Se ha producido un error que no se puede resolver." }
El primer bloque Catch controla los errores de los tipos de
excepción System.Net.WebException y System.IO.IOException. El
segundo bloque Catch no especifica un tipo de error. Este
segundo bloque controla los demás errores de terminación que se
producen.
Windows PowerShell busca 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 derivada de la clase
especificada. El ejemplo siguiente contiene un bloque Catch que
detecta un error de tipo "Comando no encontrado":
catch [System.Management.Automation.CommandNotFoundException]
{"Excepción heredada" }
El tipo de error especificado, CommandNotFoundException, se
hereda del tipo System.SystemException. El ejemplo siguiente también
detecta un error de tipo Comando no encontrado:
catch [System.SystemException] {"Excepción base" }
Este bloque Catch controla el error de tipo "Comando no
encontrado" y otros errores que se heredan del tipo SystemException.
Si especifica una clase de error y una de sus clases derivadas,
coloque el bloque Catch correspondiente a la clase derivada
delante del bloque Catch correspondiente a la clase general.
Liberar recursos usando Finally
Para liberar los recursos utilizados por un script, agregue un
bloque Finally detrás de los bloques Catch y Try. Las
instrucciones del bloque Finally se ejecutan con independencia
de que el bloque Try encuentre un error de terminación. Windows
PowerShell ejecuta el bloque Finally antes de que el script
finalice o antes de que el bloque actual salga del ámbito.
Un bloque Finally se ejecuta aunque se utilice CTRL+C para
detener el script. También se ejecuta si una palabra clave Exit
detiene el script desde un bloque Catch.
VEA TAMBIÉN
about_Errors
about_Trap