Try/Catch block en PowerShell es para manejar los errores que se producen en el script. Para ser específicos, los errores deben ser Errores de terminación. El bloque Finally en PowerShell no es obligatorio para escribir cada vez junto con Try/Catch, pero se ejecutará independientemente de que se produzca o no el error.
así que cuando se utiliza el bloque Try, el bloque Catch es obligatorio pero no finalmente bloque.
-
bloque Try / Catch con error de terminación-a continuación se muestra el ejemplo de error de terminación sin bloqueo final.,
Example
try{ This is not allowed "This is Allowed"}catch{ Write-Host "Error occured" -BackgroundColor DarkRed}
Output
en el ejemplo anterior, hemos devuelto algo que no está permitido pero la siguiente línea era genuina aunque no pudo ejecutarse debido al error de terminación.
nuestro objetivo es capturar la excepción y el mensaje de error generados en el bloque Try. Como sabemos, el error se almacena en la variable Error Error. Si comprueba la salida de la variable error error, puede obtener toda la vista, pero siempre que ejecute cualquier script y esté manejando los errores, asegúrese de borrar los errores antiguos utilizando $error.,clear () o usar la nueva consola de PowerShell. En caso de que conozca la ubicación de la variable de Error específica en una matriz, puede usarla directamente. Por ejemplo, $error
podemos ver cuáles son todas las propiedades de la variable Error Error.
PS C:\WINDOWS\system32> $Error | Get-Member | Select Name, MemberTypeName MemberType---- ----------Equals MethodGetHashCode MethodGetObjectData MethodGetType MethodToString MethodCategoryInfo PropertyErrorDetails PropertyException PropertyFullyQualifiedErrorId PropertyInvocationInfo PropertyPipelineIterationInfo PropertyScriptStackTrace PropertyTargetObject PropertyPSMessageDetails ScriptProperty
hay pocas propiedades de arriba que son útiles para encontrar los detalles de excepción y error. Vamos a verlos y podemos aprovecharlos en el bloque de captura también.
primera propiedad InvocationInfo., También puede usar $Error, pero este es el único error generado hasta ahora, por lo que estamos usando directamente directly Error, pero no puede obtener la ventana emergente de autosugestión con la variable directly error directamente.
PS C:\WINDOWS\system32> $Error.InvocationInfoMyCommand :BoundParameters : {}UnboundArguments : {}ScriptLineNumber : 3OffsetInLine : 5HistoryId : 50ScriptName :Line : This is not allowedPositionMessage : At line:3 char:5 + This is not allowed + ~~~~PSScriptRoot :PSCommandPath :InvocationName : ThisPipelineLength : 0PipelinePosition : 0ExpectingInput : FalseCommandOrigin : InternalDisplayScriptPosition :
puede obtener la información específica de Line y PositionMessage como se muestra a continuación.
compruebe ahora las propiedades de excepción.
PS C:\WINDOWS\system32> $Error.ExceptionThe term 'This' 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 try again.
mensaje de excepción
PS C:\WINDOWS\system32>$error.Exception.MessageThe term 'This' 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 try again.
puede utilizar las otras propiedades que considere útiles para mostrar el mensaje de error. Vamos a usar algunos de estos en el bloque Catch para atrapar el error., Como estamos trabajando con el error actual usaremos $_. para tratar el error/excepción actual.
Salida
Error Message: The term 'This' 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 try again.Error in Line: This is not allowedError in Line Number: 3Error Item Name:
Como hemos visto anteriormente no había por último bloque, pero Try/Catch continuó trabajando. Puede agregar el bloque Finally para borrar sus variables y errores y mostrar cualquier mensaje.
-
bloque Try / Catch con error de no terminación.,
como hemos visto en el ejemplo anterior, los errores de terminación se pueden controlar con el bloque Try/Catch, pero los errores no de terminación no se pueden controlar porque son cmdlets integrados y errores generados por funciones y la preferencia predeterminada para la acción de Error es continuar y, por lo tanto, el comando siguiente continuar ejecutándose incluso si el error no se maneja.
PS C:\WINDOWS\system32> $ErrorActionPreferenceContinue
para forzar el error No terminante al error de terminación necesitamos cambiar la variable Stop ErrorActionPreference a Stop o necesitamos usar el parámetro ErrorAction con el valor Stop., Aquí, vamos a usar el parámetro ErrorAction ya que lo necesitamos para un comando específico y no para todo el script.
Example
Output
Error Message: Cannot find any service with service name 'WhichService'.Error in Line: Get-Service WhichService -ErrorAction StopError in Line Number: 4Error Item Name:This is going to run anyway
como puede ver en el ejemplo anterior, Get-Service produce el error no terminante y podemos convertirlo en el parámetro de parada de error de terminación por-ErrorAction y la misma excepción ha sido atrapada por Catch Block.
-
manejo manual de excepciones específicas
Si desea manejar un tipo específico de excepción, puede proporcionar el nombre de la excepción en el bloque catch., Para saber el nombre de la excepción necesita obtener la propiedad de la variable get Error y es GetType (). En el siguiente ejemplo, necesitamos encontrar el nombre de la excepción de la salida de error a continuación.
ejemplo
supongamos que su error se almacena en la variable Error Error, debe ejecutar el comando debajo para obtener el nombre de excepción para usar en el bloque catch.
$Error.Exception.GetType().FullName
PS C:\WINDOWS\system32> $Error.Exception.GetType().FullNameSystem.Management.Automation.MethodInvocationException
obtuvo el nombre del tipo de excepción con el comando anterior, puede usar el mismo en el bloque catch para que el bloque catch atrape solo esa excepción específica.,
salida
-
captura múltiples excepciones de PowerShell.
También puede capturar las múltiples excepciones en PowerShell. Para eso, puede usar un solo bloque de Prueba y varios bloques de captura.
ejemplo
salida
Cannot find path 'C:\temp\cominfo1.html' because it does not exist.Setting up ErrorActionPreference to the Default value
aquí, en el primer comando, se genera un error por lo que el siguiente comando no se ejecutará. Si el primer comando no genera ningún error, se comprobará el siguiente comando y, si se produce la excepción, se ejecutará Catch con ese bloque de excepción específico.,
si no desea manejar múltiples excepciones y aún necesita algunos comandos, los errores pueden ignorarse pero no deben pasar por el bloque catch para que el siguiente comando pueda ejecutarse, puede usar Ignore o SilentlyIgnore en el parámetro ErrorAction.