about_Trap

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

TEMA

about_Trap

DESCRIPCIÓN BREVE

Describe una palabra clave que controla un error de terminación.

DESCRIPCIÓN LARGA

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 en la canalización actual. En otros lenguajes, como C#, los errores de terminación se conocen como excepciones.

La palabra clave Trap especifica una lista de instrucciones que se ejecutan 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 la función continúe en lugar de detenerse.

SINTAXIS

La instrucción Trap tiene la sintaxis siguiente:

          trap [[<error type>]] {<statement list>}

La instrucción Trap incluye una lista de instrucciones que se ejecutan cuando se produce un error de terminación. La palabra clave Trap puede especificar opcionalmente un tipo de error. Un tipo de error requiere corchetes.

Un script o un comando pueden 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 se controla de otra forma en un script o comando, Windows PowerShell comprueba si existe una instrucción Trap que controle el error. Si está presente una instrucción Trap, Windows PowerShell sigue ejecutando el script o comando en la instrucción Trap.

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

          trap {"Error found."}

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

          function TrapTest {
              trap {"Error found."}
              nonsenseString
              }

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

          C:\PS> TrapTest
          Error found.

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

          function TrapTest {
              trap {"Error found: $_"}
              nonsenseString
              }

Si se ejecuta esta versión de la función, se devuelve lo siguiente:

          C:\PS> TrapTest
          Error found: 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 then try again.

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

INTERCEPTAR LOS 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] 
              {"Command error trapped"}

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 las instrucciones incluidas en la lista de instrucciones Trap, Windows PowerShell escribe el objeto de error en la secuencia de error y continúa el script.

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

          trap [System.Exception] {"An error trapped"}

El tipo de error CommandNotFoundException se hereda del tipo System.Exception. Esta instrucción intercepta un error que se crea mediante un comando desconocido. Además, intercepta otros tipos de error.

Puede haber más de una instrucción Trap en un script. Cada error puede ser interceptado por una sola instrucción de captura. Si se produce un error y está disponible más de una instrucción Trap, Windows PowerShell usa la instrucción Trap con el tipo de error más específico que coincida con el error.

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

          trap {"Other terminating error trapped" }
          trap [System.Management.Automation.CommandNotFoundException] {"Command error trapped"}
          nonsenseString

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

          Command  error trapped
          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 then try again.
          At C:\PS>testScript1.ps1:3 char:19
          +     nonsenseString <<<<

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

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

          trap {"Other terminating error trapped" }
          trap [System.Management.Automation.CommandNotFoundException] 
              {"Command error trapped"}
          1/$null

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

          Other terminating error trapped
          Attempted to divide by zero.
          At C:PS> errorX.ps1:3 char:7
          +     1/ <<<< $null

El intento de dividir por cero no crea un error CommandNotFoundException. En su lugar, ese error lo intercepta la otra instrucción Trap, que intercepta cualquier error de terminación.

INTERCEPTACIÓN DE ERRORES Y ÁMBITO

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

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

          function function1 {
              trap { "An error: " }
              NonsenseString
              "function1 was completed"
              }

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

          function1
          An error: 
          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 
          then try again.
          At C:\PS>TestScript1.ps1:3 char:19
          +     NonsenseString <<<<

          function1 was completed

La instrucción Trap de la función intercepta el error. Después de mostrar el mensaje, Windows PowerShell reanuda la ejecución de la función. Tenga en cuenta que Function1 se completó.

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

          function function2 {
              NonsenseString
              "function2 was completed"
              }

          trap { "An error: " }
              . . .
          function2

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

          An error: 
          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 
          then try again.
          At C:\PS>TestScript2.ps1:4 char:19
          +     NonsenseString <<<<

En este ejemplo, no se ejecutó el comando "function2 was completed". Aunque ambos errores 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 la función después de que se ejecute la instrucción Trap.

USAR LAS PALABRAS CLAVE BREAK Y CONTINUE

Puede usar las palabras clave Break y Continue en una instrucción Trap para determinar si un script o un comando siguen 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 el script. La función de ejemplo siguiente usa la palabra clave Break en una instrucción Trap:

          C:\PS> function break_example {
              trap {"Error trapped"; break;}
              1/$null
              "Function completed."
              }

          C:\PS> break_example
          Error trapped
          Attempted to divide by zero.
          At line:4 char:7

Dado que la instrucción Trap incluye la palabra clave Break, la función no sigue ejecutándose y no se ejecuta la línea "Function completed".

Si incluye una instrucción Continue en una instrucción Trap, Windows PowerShell se reanuda después de la instrucción que produjo el error, tal como harí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 usa la palabra clave Continue en una instrucción Trap:

          C:\PS> function continue_example {
              trap {"Error trapped"; continue;}
              1/$null
              "Function completed."}

          C:\PS> continue_example
          Error trapped
          Function completed.

La función se reanuda después de que se intercepte el error y se ejecuta la instrucción "Function completed". No se escribe ningún error en la secuencia de error.

VEA TAMBIÉN

about_Break

about_Continue

about_Scopes

about_Throw

about_Try_Catch_Finally