about_Try_Catch_Finally

Se aplica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

TEMA

about_Try_Catch_Finally

DESCRIPCIÓN BREVE

Describe cómo usar los bloques Try, Catch y Finally para controlar errores de terminación.

DESCRIPCIÓN LARGA

Use los bloques Try, Catch y Finally para responder a los errores de terminación en scripts o para controlarlos. La instrucción Trap también puede usarse 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 alguna manera, Windows PowerShell también deja de ejecutar la función o el script con la canalización actual. En otros lenguajes, como C#, los errores de terminación se conocen como excepciones. Para obtener más información sobre los errores, vea about_Errors.

Use el bloque Try para definir una sección de un script en la que desee que Windows PowerShell supervise los errores. Cuando se produce un error en el bloque Try, el error 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 coincidente, Windows PowerShell sigue buscando un bloque Catch adecuado o una instrucción Trap en los ámbitos primarios. Una vez completado un bloque Catch, o si no se encuentra ningún bloque Catch o instrucción Trap adecuados, se ejecuta el bloque Finally. Si no se puede controlar el error, el error se escribe en la secuencia de error.

Un bloque Catch puede incluir comandos para realizar un seguimiento del error o para recuperar el flujo esperado del script. Un bloque Catch puede especificar qué tipos de error captura. Una instrucción Try puede incluir varios bloques Catch para diferentes tipos de errores.

Un bloque Finally puede usarse para liberar los recursos que ya no necesita el script.

Try, Catch y Finally son similares a las palabras clave Try, Catch y Finally que se usan 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. Una instrucción Try debe tener al menos un bloque Catch o un bloque Finally.

A continuación se muestra la sintaxis del 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 Catch apropiado.

A continuación se muestra la sintaxis del bloque Catch:

          catch [[<error type>][',' <error type>]*] {<statement list>}

Los tipos de error aparecen entre corchetes. Los corchetes exteriores indican que el elemento es opcional.

La palabra clave Catch va seguida de una lista opcional de especificaciones del 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 apropiado. Si encuentra uno, se ejecutan las instrucciones del bloque Catch.

El bloque Catch puede especificar uno o más tipos de error. Un tipo de error es una excepción de Microsoft .NET Framework o una excepción que se deriva 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 detectado 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 {<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 errores o si se detectó un error en una instrucción Catch.

Tenga en cuenta 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 salida. Por lo tanto, si incluye una instrucción para que se muestre, como "Finally block has run" (El bloque Finally se ejecutó), no se mostrará después de presionar CTRL+C, incluso si el el bloque Finally se ejecutó.

DETECTAR ERRORES

El script de ejemplo siguiente muestra un bloque Try con un bloque Catch:

          try { NonsenseString }
          catch { "An error occurred." }

La palabra clave Catch debe ir inmediatamente después del bloque Try o de otro bloque Catch.

Windows PowerShell no reconoce "NonsenseString" como cmdlet u otro elemento. Si se ejecuta este script, se devuelve el resultado siguiente:

          An error occurred.

Cuando el script encuentra "NonsenseString", produce un error de terminación. El bloque Catch controla el error ejecutando la lista de instrucciones dentro del bloque.

USAR VARIAS INSTRUCCIONES CATCH

Una instrucción Try puede tener un número cualquiera 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]
          {
              "Unable to download MyDoc.doc from https://www.contoso.com."
          }
          catch
          {
              "An error occurred that could not be resolved."
          }

El primer bloque Catch controla los errores de los tipos System.Net.WebException y 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.

Windows PowerShell hace coincidir 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 "Command Not Found" (No se encontró el comando):

          catch [System.Management.Automation.CommandNotFoundException] 
              {"Inherited Exception" }

El tipo de error especificado, CommandNotFoundException, se hereda del tipo System.SystemException. El ejemplo siguiente también detecta un error "Command Not Found":

          catch [System.SystemException] {"Base Exception" }

Este bloque Catch controla el error "Command Not Found" 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 de la clase derivada antes del bloque Catch para la clase general.

LIBERAR RECURSOS USANDO FINALLY

Para liberar los recursos usados por un script, agregue un bloque Finally después de los bloques Try y Catch. Las instrucciones del bloque Finally se ejecutan independientemente de si el bloque Try detecta 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 use CTRL+C para detener el script. Un bloque Finally también se ejecuta si una palabra clave Exit detiene el script desde un bloque Catch.

VEA TAMBIÉN

about_Break

about_Continue

about_Scopes

about_Throw

about_Trap