TEMA
    about_Trap

DESCRIPCIÓN BREVE
    Describe una palabra clave que controla un error de terminación.


DESCRIPCIÓN DETALLADA
    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 en la canalización actual. En otros lenguajes, como C#, 
    los errores de terminación reciben el nombre de excepciones.


    La palabra clave Trap especifica una lista de instrucciones que 
    se han de ejecutar cuando se produce un error de terminación. Las 
    instrucciones Trap controlan los errores de terminación y 
    permiten que la ejecución del script o función continúe en lugar 
    de detenerse.


  Sintaxis

      La instrucción Trap tiene la sintaxis siguiente:

          trap [[<tipo de error>]] {<lista de instrucciones>}


      La instrucción Trap incluye una lista de instrucciones para 
      ejecutarse cuando se produce un error de terminación. 
      Opcionalmente, la palabra clave Trap puede especificar un tipo 
      de error. Un tipo de error requiere corchetes. 


      Un script o comando puede tener varias instrucciones Trap. Las 
      instrucciones Trap pueden aparecer en cualquier parte del 
      script o comando. 


  Interceptar todos los errores de terminación

      Cuando se produce un error de terminación que no está 
      controlado de otra manera en un script o comando, Windows 
      PowerShell busca una instrucción Trap que controle el error. Si 
      hay una instrucción Trap, Windows PowerShell continúa 
      ejecutando el script o comando en la instrucción Trap.
 

      El ejemplo siguiente es una instrucción Trap muy simple:

          trap {"Error detectado."}


      Esta instrucción Trap intercepta cualquier error de 
      terminación. El ejemplo siguiente es una función que contiene 
      esta instrucción Trap:

          function TrapTest {
              trap {"Error detectado."}
              cadenaSinSentido
              }


      Esta función incluye una cadena "sin sentido" que produce un 
      error. La ejecución de esta función devuelve lo siguiente:

          C:\PS> TrapTest
          Error detectado.


      El ejemplo siguiente incluye una instrucción Trap que muestra 
      el error utilizando la variable automática $_:

          function TrapTest {
              trap {"Error detectado: $_"}
              cadenaSinSentido
              }


      La ejecución de esta versión de la función devuelve lo siguiente:

          C:\PS> TrapTest
          Error detectado: El término 'cadenaSinSentido' no se 
          reconoce como nombre de un cmdlet, función, archivo de 
          script o programa ejecutable. Compruebe si escribió 
          correctamente el nombre o, si incluyó una ruta de acceso, 
          compruebe que dicha ruta es correcta e inténtelo de nuevo. 


      Las instrucciones Trap pueden ser también más complejas. Una 
      instrucción Trap puede incluir varias condiciones o llamadas a 
      funciones. Puede registrar, probar o incluso ejecutar otro programa.


   Interceptar errores de terminación especificados

      El ejemplo siguiente es una instrucción Trap que intercepta el 
      tipo de error CommandNotFoundException:

          trap [System.Management.Automation.CommandNotFoundException]
           {"Error de comando interceptado"}


      Cuando una función o script encuentra una cadena que no 
      coincide con un comando conocido, esta instrucción Trap muestra 
      la cadena "Error de comando interceptado". Después de ejecutar 
      cualquier instrucción de la lista de instrucciones Trap, 
      Windows PowerShell escribe el objeto de error en la secuencia 
      de error y, a continuación, continúa el script.


      Windows PowerShell utiliza los tipos de excepción de Microsoft 
      .NET Framework. El ejemplo siguiente especifica el tipo de 
      error System.Exception:

          trap [System.Exception] {"Error interceptado"}


      El tipo de error CommandNotFoundException se hereda del tipo 
      System.Exception. Esta instrucción intercepta un error creado 
      por un comando desconocido. También intercepta otros tipos de error.


      Se puede tener más de una instrucción Trap en un script. Cada 
      error puede ser interceptado por sólo una instrucción Trap. Si 
      se produce un error y hay más de una instrucción Trap 
      disponible, Windows PowerShell utiliza la instrucción Trap con 
      el tipo de error más representativo que coincide con el error. 


      El ejemplo de script siguiente contiene un error. El script 
      incluye una instrucción Trap general que intercepta cualquier 
      error de terminación y una instrucción Trap concreta que 
      especifica el tipo CommandNotFoundException.

          trap {"Otro error de terminación interceptado" } trap 
          [System.Management.Automation.CommandNotFoundException] {"Error de 
          terminación interceptado"} cadenaSinSentido


      La ejecución de este script produce el resultado siguiente:

          Error de comando interceptado
          El término 'cadenaSinSentido' no se reconoce como nombre de 
          un cmdlet, función, archivo de script o programa 
          ejecutable. Compruebe si escribió correctamente el nombre 
          o, si incluyó una ruta de acceso, compruebe que dicha ruta 
          es correcta e inténtelo de nuevo.
          En C:\PS>testScript1.ps1:3 Carácter:19
          +   cadenaSinSentido <<<< 


      Dado que Windows PowerShell no reconoce "cadenaSinSentido" como 
      un cmdlet u otro elemento, devuelve un error de tipo 
      CommandNotFoundException. Este error de terminación lo 
      intercepta la instrucción Trap específica.


      El ejemplo de script siguiente contiene las mismas 
      instrucciones Trap con un error diferente:

          trap {"Otro error de terminación interceptado" } trap 
          [System.Management.Automation.CommandNotFoundException] 
          {"Error de comando interceptado"}
          1/$null


      La ejecución de este script produce el resultado siguiente:

          Otro error de terminación interceptado
          Intento de dividir por cero.
          En C:PS> errorX.ps1:3 Carácter:7
          +   1/ <<<< $null


      El intento de dividir por cero no crea un error de tipo 
      CommandNotFoundException, sino que ese error es interceptado 
      por la otra instrucción Trap, que intercepta cualquier error de 
      terminación. 


  Interceptar errores y ámbito

      Si un error de terminación se produce en el mismo ámbito que la 
      instrucción Trap, después de ejecutarse las instrucciones Trap, 
      Windows PowerShell continúa en la instrucción después del 
      error. Si la instrucción Trap está en un ámbito diferente del 
      ámbito del error, la ejecución continúa en la siguiente 
      instrucción que está en el mismo ámbito que el de la 
      instrucción Trap.
 

      Por ejemplo, si se produce un error en una función y la 
      instrucción Trap está en la función, el script continúa en la 
      siguiente instrucción. Por ejemplo, el script siguiente 
      contiene un error y una instrucción Trap:

          function función1 {
              trap { "Un error: " }
              CadenaSinSentido
              "función1 completada"
              }


      Más adelante en el script, la ejecución de la función función1 
      produce el resultado siguiente: 

          función1
          Un error: 
          El término 'CadenaSinSentido' no se reconoce como nombre de 
          un cmdlet, función, archivo de script o programa 
          ejecutable. Compruebe si escribió correctamente el nombre 
          o, si incluyó una ruta de acceso, compruebe que dicha ruta 
          es correcta e inténtelo de nuevo.
          En C:\PS>TestScript1.ps1:3 Carácter:19
          +   CadenaSinSentido <<<<

          función1 completada 
 

      La instrucción Trap en la función intercepta el error. Después 
      de mostrarse el mensaje, Windows PowerShell reanuda la 
      ejecución de la función. Observe que la función función1 se 
      completó.


      Compare esto con el ejemplo siguiente, que tiene el mismo error 
      y la misma instrucción Trap. En este ejemplo, la instrucción 
      Trap se produce fuera de la función:

          function función2 {
              CadenaSinSentido
              "función2 completada"
              }

          trap { "Un error: " }
              . . .
          función2


      Más adelante en el script, la ejecución de la función función2 
      produce el resultado siguiente:

          Un error: 
          El término 'CadenaSinSentido' no se reconoce como nombre de 
          un cmdlet, función, archivo de script o programa 
          ejecutable. Compruebe si escribió correctamente el nombre 
          o, si incluyó una ruta de acceso, compruebe que dicha ruta 
          es correcta e inténtelo de nuevo.
          En C:\PS>TestScript2.ps1:4 Carácter:19
          +   CadenaSinSentido <<<<


      En este ejemplo, no se ejecutó el comando "función2 
      completada". Aunque ambos errores de terminación se producen 
      dentro de una función, si la instrucción Trap está fuera de la 
      función, Windows PowerShell no vuelve a ella después de 
      ejecutarse la instrucción Trap.


  Utilizar las palabras clave Break y Continue

      Puede utilizar las palabras clave Break y Continue en una 
      instrucción Trap para determinar si un script o comando 
      continúa ejecutándose después de un error de terminación. 


      Si incluye una instrucción Break en una lista de instrucciones 
      Trap, Windows PowerShell detiene la función o script. La 
      función de ejemplo siguiente utiliza la palabra clave Break en 
      una instrucción Trap:

          C:\PS> function break_example {
              trap {"Error interceptado"; break;}
              1/$null
              "Función completada."
              }

          C:\PS> break_example
          Error interceptado
          Intento de dividir por cero.
          En línea:4 Carácter:7


      Como la instrucción Trap incluye la palabra clave Break, la 
      función no continúa ejecutándose y la línea " Función 
      completada" no se ejecuta.


      Si incluye una instrucción Continue en una instrucción Trap, 
      Windows PowerShell se reanudará después de la instrucción que 
      produjo el error, tal como sucedería sin Break o Continue. Sin 
      embargo, con la palabra clave Continue, Windows PowerShell no 
      escribe un error en la secuencia de error. 


      La función de ejemplo siguiente utiliza la palabra clave 
      Continue en una instrucción Trap:

          C:\PS> function continue_example {
              trap {"Error interceptado"; continue;} 1/$null
              "Función completada."}

          C:\PS> continue_example
          Error interceptado
          Función completada. 


      La función se reanuda una vez interceptado el error, y se 
      ejecuta la instrucción "Función completada". No se escribe 
      ningún error en la secuencia de error. 


VEA TAMBIÉN
    about_Break
    about_Continue
    about_Throw
    about_Try_Catch_Finally
    about_Scopes






Tabla de contenido