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