Explicar o bloco de tentativa/captura/finalmente bloquear em PowerShell

tentar / Catch em PowerShell é lidar com os erros que são produzidos no script. Para ser mais específico, os erros devem ser o fim dos erros. O bloco final no PowerShell não é obrigatório para escrever cada vez junto com a tentativa/captura, mas será executado independentemente do erro ocorrer ou não.

assim, quando você usa o bloco de tentativa, o bloco de captura é obrigatório, mas não finalmente bloco.

  • bloco de tentativa / captura com erro de terminação − abaixo está o exemplo de erro de terminação sem bloqueio final.,

Exemplo

try{ This is not allowed "This is Allowed"}catch{ Write-Host "Error occured" -BackgroundColor DarkRed}

Saída

No exemplo acima, temos o retorno de algo que não é permitido, mas a próxima linha era genuíno, embora ele não conseguia executar devido a erro de encerramento.

nosso objetivo é pegar a exceção e mensagem de erro gerada no bloco de tentativa. Como sabemos, o erro é armazenado na variável $Error. Se verificar o resultado da variável $error, poderá obter toda a vista, mas sempre que executar qualquer programa e estiver a lidar com os erros, certifique-se que limpa os erros antigos usando o $error.,comando clear () ou use a nova consola PowerShell. No caso de você saber a localização específica da variável de erro em um array você pode usar diretamente isso. Por exemplo, $error

Podemos ver quais são todas as propriedades da variável $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

Existem poucas propriedades de cima são úteis para encontrar a exceção e detalhes de erro. Vamos vê-los e podemos aproveitá-los no bloco de captura também.

primeira propriedade InvocationInfo., Você também pode usar o erro$, mas este é o único erro gerado até agora, então estamos usando o erro $diretamente, mas você não pode obter o Popup de auto-sugestão com a variável $error diretamente.

você pode obter a informação específica a partir da linha e da mensagem de posicionamento como mostrado abaixo.

verifique agora as propriedades da excepção.

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.

mensagem de excepção

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.

pode usar as outras propriedades que considere úteis para mostrar a mensagem de erro. Vamos usar alguns destes no bloco de captura para apanhar o erro., Como estamos trabalhando com o erro atual vamos usar $_. para lidar com o erro/excepção actual.

Saída

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 vimos acima, não houve, Finalmente, bloco, mas com Try/Catch, continuou a trabalhar. Você pode adicionar o bloco final para limpar suas variáveis e erros e exibir qualquer mensagem.

  • tente / Catch block with Non-Terminating error.,

Como vimos no exemplo acima que erros de encerramento pode ser controlado com o bloco Try/Catch, mas Não erros de encerramento não é possível, porque eles são cmdlets internos e funções de erros gerados e o padrão de preferência para a ação de Erro é Continuar e, portanto, próximo comando continue a funcionar mesmo se o erro não for tratado.

PS C:\WINDOWS\system32> $ErrorActionPreferenceContinue

para forçar o erro de não-terminação para o erro de terminação, é necessário alterar a variável $ErrorActionPreference para parar ou a necessidade de usar o parâmetro de ErrorAction com o valor de paragem., Aqui, vamos usar o parâmetro de ErrorAction como precisamos dele para um comando específico e não para todo o script.

Exemplo

Saída

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 você pode ver no exemplo acima, Get-Service produz o erro de não-encerramento e podemos convertê-lo para a terminação de erro Stop –ErrorAction parâmetro e a mesma exceção foi pego pelo Bloco Catch.

  • manipulação manual excepção específica

Se quiser lidar com um tipo específico de excepção, então poderá indicar o nome da excepção no bloco de captura., Para saber o nome da exceção você precisa obter a propriedade da variável $Error e é GetType(). No exemplo abaixo, precisamos encontrar o nome da exceção a partir da saída de erro abaixo.

exemplo

suponha que o seu erro é armazenado na variável $Error, você precisa correr abaixo do comando para obter o nome da exceção para usar no bloco catch.

$Error.Exception.GetType().FullName
PS C:\WINDOWS\system32> $Error.Exception.GetType().FullNameSystem.Management.Automation.MethodInvocationException

tem o nome do tipo de excepção com o comando acima, pode usar o mesmo no bloco de captura para que o bloco de captura apanhe apenas essa excepção específica.,

saída

  • captura de casca múltipla de excepção.

Você também pode pegar as múltiplas exceções em PowerShell. Para isso, você pode usar um único bloco de tentativa e vários blocos de captura.

Exemplo

Saída

Cannot find path 'C:\temp\cominfo1.html' because it does not exist.Setting up ErrorActionPreference to the Default value

Aqui, no primeiro comando, o próprio erro gerado para o próximo comando não será executado. Se o primeiro comando não gerar qualquer erro, então o próximo comando será verificado e se a exceção ocorrer, então o Catch com esse bloco de exceção específico será executado.,

Se você não quiser lidar com várias exceções e ainda assim você precisa de alguns erros de comandos podem ser ignorados, mas não devem passar pelo bloco de captura para que o próximo comando possa ser executado então você pode usar o ignorar ou SilentlyIgnore no parâmetro ErrorAction.

Publicado em 06-Jun-2020 16:36:12

Anúncios

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

Ir para a barra de ferramentas