Partilhar via


about_Trap

Breve descrição

Descreve uma palavra-chave que lida com um erro de terminação.

Descrição longa

Um erro de encerramento interrompe a execução de uma instrução. Se o PowerShell não manipular um erro de encerramento de alguma forma, o PowerShell também interromperá a execução da função ou do script no pipeline atual. Em outras linguagens, como C#, os erros de terminação são conhecidos como exceções.

A palavra-chave trap especifica uma lista de instruções a serem executadas quando ocorre um erro de encerramento. trap instruções podem lidar com erros de encerramento das seguintes maneiras:

  • Exiba o erro depois de processar o bloco de instrução trap e continuar a execução do script ou função que contém o trap. Esse comportamento é o padrão.

    Observação

    Quando ocorre o erro de terminação num bloco de instruções subordinadas, como uma if instrução ou foreach loop, as instruções no trap bloco são executadas e a execução continua na próxima instrução fora do bloco subordinado.

  • Exiba o erro e anule a execução do script ou função que contém o trap usando break na instrução trap.

  • Silencie o erro, mas continue a execução do script ou função que contém o trap usando continue na instrução trap.

A lista de instruções do trap pode incluir várias condições ou chamadas de função. Um trap pode escrever logs, condições de teste ou até mesmo executar outro programa.

Sintaxe

A instrução trap tem a seguinte sintaxe:

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

A instrução trap inclui uma lista de instruções a serem executadas quando ocorre um erro de encerramento. Uma instrução trap consiste na palavra-chave trap, opcionalmente seguida por uma expressão de tipo, e no bloco de instrução que contém a lista de instruções a serem executadas quando um erro é intercetado. A expressão de tipo refina os tipos de erros que o trap deteta.

Um script ou comando pode ter várias instruções trap. As instruções trap podem aparecer em qualquer parte do script ou comando.

Intercetando todos os erros de terminação

Quando ocorre um erro de encerramento que não é tratado de outra forma em um script ou comando, o PowerShell verifica se há uma instrução trap que manipula o erro. Se uma instrução trap estiver presente, o PowerShell continuará executando o script ou comando na instrução trap.

O seguinte exemplo é uma declaração mínima de trap:

trap { 'Error found.' }

Esta instrução trap interceta qualquer erro de encerramento.

No exemplo a seguir, a função inclui uma cadeia de caracteres nonsense que causa um erro de tempo de execução.

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

TrapTest

A execução desta função retorna a seguinte saída:

Error found.
nonsenseString:
Line |
   3 |      nonsenseString
     |      ~~~~~~~~~~~~~~
     | The term 'nonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.

O exemplo seguinte inclui uma trap instrução que apresenta o erro usando a $_ variável automática de ou $PSItem :

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

TrapTest

A execução desta versão da função retorna a seguinte saída:

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
try again.
nonsenseString:
Line |
   3 |      nonsenseString
     |      ~~~~~~~~~~~~~~
     | The term 'nonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.

Importante

trap as instruções podem ser definidas em qualquer lugar dentro de um determinado bloco de script, mas aplicam-se sempre a todas as instruções desse bloco de script. Durante a execução, as instruções trap num bloco são definidas antes de quaisquer outras instruções serem executadas. Noutras linguagens, como o JavaScript, isto é conhecido como içamento. Isso significa que trap instruções se aplicam a todas as instruções nesse bloco, mesmo que a execução não tenha avançado além do ponto em que foram definidas. Por exemplo, definir um trap no final de um script e gerar um erro na primeira instrução ainda aciona esse trap.

Intercetação de erros específicos

Um script ou comando pode ter várias instruções trap. Uma trap pode ser definida para lidar com erros específicos.

O exemplo a seguir é uma instrução trap que interceta o erro específico CommandNotFoundException:

trap [System.Management.Automation.CommandNotFoundException] {
    'Command error trapped'
}

Quando uma função ou script encontra uma cadeia de caracteres que não corresponde a um comando conhecido, essa instrução trap exibe a cadeia de caracteres Command error trapped. Depois de executar a lista de instruções trap, o PowerShell grava o objeto de erro no fluxo de erro e continua o script.

O PowerShell usa tipos de exceção .NET. O exemplo a seguir especifica o tipo de erro System.Exception:

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

O tipo de erro CommandNotFoundException herda do System.Exception. Esta instrução interceta quaisquer erros gerados por comandos desconhecidos. Também captura outros tipos de erro.

Você pode encontrar o tipo de exceção para um erro inspecionando o objeto de erro. O exemplo a seguir mostra como obter o nome completo da exceção para o último erro em uma sessão:

nonsenseString
$Error[0].Exception.GetType().FullName
nonsenseString: The term 'nonsenseString' is not recognized as a name of a
cmdlet, function, script file, or executable program. Check the spelling
of the name, or if a path was included, verify that the path is correct
and try again.

System.Management.Automation.CommandNotFoundException

Você pode ter mais de uma instrução trap em um script. Apenas uma instrução trap pode intercetar cada tipo de erro. Quando ocorre um erro de terminação, o PowerShell procura o trap com a correspondência mais específica, começando no bloco de script atual de execução.

O exemplo de script a seguir contém um erro. O script inclui uma instrução geral trap que interceta qualquer erro que termine o processo e uma instrução específica trap que define o tipo CommandNotFoundException.

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

A execução desse script produz o seguinte resultado:

Command error trapped
nonsenseString:
Line |
   5 |      nonsenseString
     |      ~~~~~~~~~~~~~~
     | The term 'nonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.

Como o PowerShell não reconhece nonsenseString como um cmdlet ou outro item, ele retorna um erro CommandNotFoundException. A instrução trap específica interceta esse erro de encerramento.

O exemplo de script a seguir contém as mesmas instruções trap com um erro diferente:

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

A execução desse script produz o seguinte resultado:

Other terminating error trapped
RuntimeException:
Line |
   5 |  1/$null
     |  ~~~~~~~
     | Attempted to divide by zero.

A tentativa de dividir por zero não cria um erro de CommandNotFoundException . A outra instrução trap, que interceta qualquer erro de encerramento, captura o erro de divisão por zero.

Captura de erros num bloco de scripts

Por padrão, quando ocorre um erro de encerramento, a execução é transferida para a instrução trap. Depois que o bloco trap é executado, o controle retorna para o próximo bloco de instrução após o local do erro.

Por exemplo, quando ocorre um erro de encerramento em uma foreach instrução, a instrução é executada e a trap execução continua na próxima instrução após o foreach bloco, não dentro do foreach bloco.

trap { 'An error occurred!'}
foreach ($x in 3..-1) {
       "1/$x = "
       "`t$(1/$x)"
}
'after loop'
1/3 =
        0.333333333333333
1/2 =
        0.5
1/1 =
        1
1/0 =
An error occurred!
RuntimeException:
Line |
   4 |         "`t$(1/$x)"
     |              ~~~~
     | Attempted to divide by zero.
after loop

Na saída, você pode ver os loops continuarem até a última iteração. Quando o script tenta dividir 1 por 0, o PowerShell lança um erro de encerramento. O script salta o resto da foreach instrução, executa-a try e continua após a foreach instrução.

Erros de trapping e escopo

Se ocorrer um erro de terminação no mesmo bloco de scripts que a trap instrução, o PowerShell executa a lista de instruções definidas pelo trap. A execução continua na instrução após o erro. Se a trap instrução estiver num bloco de script diferente do erro, a execução continua na próxima instrução que está no mesmo bloco de script que a trap instrução.

Por exemplo, se ocorrer um erro em uma função e a instrução trap estiver na função, o script continuará na próxima instrução. O script a seguir contém um erro e uma instrução trap:

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

function1

A execução desse script produz o seguinte resultado:

An error:
NonsenseString:
Line |
   3 |      NonsenseString
     |      ~~~~~~~~~~~~~~
     | The term 'NonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.
function1 was completed

A instrução trap na função interceta o erro. Depois de exibir a mensagem, o PowerShell retoma a execução da função. Note que Function1 foi concluído após a declaração trap.

Compare esse comportamento com o seguinte exemplo, que tem o mesmo erro e instrução trap. Neste exemplo, a instrução trap ocorre fora da função:

function function2 {
    NonsenseString
    'function2 was completed'
}

trap { 'An error:' }

function2

A execução da função Function2 produz o seguinte resultado:

An error:
NonsenseString:
Line |
   2 |      NonsenseString
     |      ~~~~~~~~~~~~~~
     | The term 'NonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.

Neste exemplo, o comando function2 was completed não foi executado. Em ambos os exemplos, o erro de encerramento ocorre dentro da função. Neste exemplo, no entanto, a instrução trap está fora da função. O PowerShell não volta para a função depois que a instrução trap é executada.

Atenção

Quando múltiplas armadilhas são definidas para a mesma condição de erro, é usada a primeira trap definida lexicamente (mais alta no bloco de script).

No exemplo a seguir, apenas o trap com whoops 1 executa.

Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { 'whoops 1'; continue }
trap { 'whoops 2'; continue }

Importante

Uma instrução trap tem como escopo o local onde ela é compilada. Se você tiver uma instrução trap dentro de uma função ou script com origem em pontos, quando a função ou o script com origem em pontos for encerrada, todas as instruções trap dentro serão removidas.

Usando as palavras-chave break e continue

Você pode usar as palavras-chave break e continue em uma instrução trap para determinar se um script ou comando continua a ser executado após um erro de encerramento.

Se você incluir uma instrução break em uma lista de instruções trap, o PowerShell interromperá a função ou o script. A função de exemplo a seguir usa a palavra-chave break em uma instrução trap:

function break_example {
    trap {
        'Error trapped'
        break
    }
    1/$null
    'Function completed.'
}

break_example
Error trapped
ParentContainsErrorRecordException:
Line |
   6 |      1/$null
     |      ~~~~~~~
     | Attempted to divide by zero.

Como a instrução trap incluiu a palavra-chave break, a função não continua a ser executada e a linha Function completed não é executada.

Se incluir uma palavra-chave continue numa instrução trap, o PowerShell será retomado após a instrução que causou o erro, da mesma forma que faria sem break ou continue. No entanto, com a palavra-chave continue, o PowerShell não grava um erro no fluxo de erros.

A função de exemplo a seguir usa a palavra-chave continue em uma instrução trap:

function ContinueExample {
    trap {
        'Error trapped'
        continue
    }
    foreach ($x in 3..-1) {
       "1/$x = "
       "`t$(1/$x)"
    }
    'End of function'
}

ContinueExample
1/3 =
        0.333333333333333
1/2 =
        0.5
1/1 =
        1
1/0 =
Error trapped
End of function

A função é retomada depois que o erro é intercetado e a instrução End of function é executada. Nenhum erro é gravado no fluxo de erro.

Observações

trap as instruções fornecem uma forma de garantir que todos os erros de terminação dentro de um bloco de script são tratados. Para um tratamento mais detalhado de erros, use try/catch blocos onde as armadilhas são definidas com catch instruções específicas. As instruções catch só se aplicam ao código dentro da instrução try associada. Para obter mais informações, consulte about_Try_Catch_Finally.

Consulte também