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