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("http://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