Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Descrição curta
Descreve uma palavra-chave que lida com um erro de encerramento.
Descrição longa
Um erro terminal impede a execução de uma declaração. Se o PowerShell não lidar com 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 outros idiomas, como C#, erros de encerramento são conhecidos como exceções.
A palavra-chave trap especifica uma lista de instruções a serem executadas quando ocorrer um erro de encerramento. As instruções trap podem lidar com os erros de encerramento das seguintes maneiras:
Exiba o erro após o processamento do bloco da instrução
trape continue a execução do script ou da função que contém otrap. Esse é o comportamento padrão.Observação
Quando o erro de encerramento ocorre em um bloco de script subordinado, como uma instrução
ifou um loopforeach, as instruções no blocotrapsão executadas e a execução continua na próxima instrução fora do bloco de script subordinado.Exiba o erro e anule a execução do script ou função que contém o
trapusandobreakna instruçãotrap.Silencie o erro, mas continue a execução do script ou função que contém o
trapusandocontinuena instruçãotrap.
A lista de instruções do trap pode incluir várias condições ou chamadas de função. Um trap pode gravar 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 ocorrer um erro de encerramento. Uma instrução trap consiste na palavra-chave trap, opcionalmente seguida por uma expressão de tipo e o bloco de instrução que contém a lista de instruções a serem executadas quando um erro é interceptado. A expressão de tipo refina os tipos de erros que o trap captura.
Um script ou comando pode ter várias instruções trap. As instruções trap podem aparecer em qualquer lugar do script ou comando.
Interceptação de todos os erros de encerramento
Quando ocorre um erro de encerramento que não é tratado de outra maneira em um script ou comando, o PowerShell verifica se há uma trap instrução que manipula o erro. Se uma instrução trap estiver presente, o PowerShell continuará executando o script ou o comando na instrução trap.
O exemplo a seguir é uma instrução muito simples trap :
trap {"Error found."}
Esta instrução trap intercepta qualquer erro de encerramento.
No exemplo a seguir, a função inclui uma cadeia de caracteres sem sentido que causa um erro de runtime.
function TrapTest {
trap {"Error found."}
nonsenseString
}
TrapTest
A execução dessa função retorna o seguinte:
Error found.
nonsenseString:
Line |
3 | nonsenseString
| ~~~~~~~~~~~~~~
| 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.
O exemplo a seguir inclui uma instrução trap que exibe o erro usando a variável automática $_:
function TrapTest {
trap {"Error found: $_"}
nonsenseString
}
TrapTest
A execução desta versão da função retorna o seguinte:
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 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.
Importante
trap As instruções podem ser definidas em qualquer lugar dentro de um determinado escopo, mas sempre se aplicam a todas as instruções nesse escopo. Em runtime, as instruções trap em um bloco são definidas antes de qualquer outra instrução ser executada. Em JavaScript, isso é conhecido como guindaste. Isso significa que trap as 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 são definidas. Por exemplo, a definição de trap no final de um script e geração de um erro na primeira instrução ainda aciona trap.
Interceptando erros específicos
Um script ou comando pode ter várias instruções trap. Um trap pode ser definido para lidar com erros específicos.
O exemplo a seguir é uma instrução trap que intercepta 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 trap instrução exibe a cadeia de caracteres "Erro de comando interceptado".
Depois de executar a lista de instruções trap, o PowerShell grava o objeto de erro no fluxo de erros 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 tipo System.Exception. Essa instrução intercepta um erro criado por um comando desconhecido. Ele também captura outros tipos de erro.
Você pode ter mais de uma instrução trap em um script. Cada tipo de erro pode ser interceptado por apenas uma trap instrução. Quando ocorre um erro de encerramento, o PowerShell procura a trap correspondência mais específica, começando no escopo atual de execução.
O exemplo de script a seguir contém um erro. O script inclui uma instrução trap geral que intercepta qualquer erro de encerramento e uma instrução trap específica que especifica 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 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.
Como o PowerShell não reconhece "nonsenseString" como um cmdlet ou outro item, ele retorna um erro CommandNotFoundException . Esse erro de encerramento é capturado pela instrução específica trap .
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 |
4 | 1/$null
| ~~~~~~~
| Attempted to divide by zero.
A tentativa de dividir por zero não cria um erro CommandNotFoundException . Em vez disso, esse erro é capturado pela outra trap instrução, que intercepta qualquer erro de encerramento.
Interceptação de erros em um bloco de script
Por padrão, quando um erro de encerramento é gerado, a execução é transferida para a instrução trap. Depois que o bloco trap for executado, o controle retornará ao próximo bloco de instrução após o local do erro.
Por exemplo, quando ocorre um erro de encerramento em uma instrução foreach, a instrução trap é executada e a execução continua na próxima instrução após o bloco foreach, não dentro do bloco foreach.
trap { 'An error occurred!'}
foreach ($x in 3..0) {
1/$x
'after division'
}
'after loop'
0.333333333333333
after division
0.5
after division
1
after division
An error occurred!
RuntimeException: untitled:Untitled-1:3:4
Line |
3 | 1/$x
| ~~~~
| Attempted to divide by zero.
after loop
Na saída acima, você pode ver que os loops continuam até a última iteração.
Quando o script tenta dividir 1 por 0, um erro de encerramento é gerado. O restante do foreach scriptblock é ignorado, a try instrução é executada e o script continua após o foreach scriptblock.
Erros de interceptação e escopo
Se ocorrer um erro de encerramento no mesmo escopo que a instrução, o trap PowerShell executará 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 em um escopo diferente do erro, a execução continuará na próxima instrução que estiver no mesmo escopo da 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 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.
function1 was completed
A instrução trap na função intercepta o erro. Depois de exibir a mensagem, o PowerShell retoma a execução da função. Observe que Function1 foi concluído.
Compare isso com o exemplo a seguir, que tem o mesmo erro e trap instrução. 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 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.
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 trap instrução é executada.
Cuidado
Quando várias armadilhas são definidas para a mesma condição de erro, a primeira trap definida lexicalmente (mais alta no escopo) é usada.
No exemplo a seguir, somente o trap com "whoops 1" é executado.
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { "whoops 1"; continue }
trap { "whoops 2"; continue }
Importante
Uma instrução Trap tem como escopo o local em que ela é compilada. Se você tiver uma instrução trap dentro de uma função ou script dot sourced, quando a função ou script dot sourced sair, todas as instruções trap dentro dela serão removidas.
Uso das 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 sendo 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 seguinte função de exemplo 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 trap instrução incluiu a break palavra-chave, a função não continua a ser executada e a linha "Função concluída" não é executada.
Se você incluir uma palavra-chave continue em uma instrução trap, o PowerShell continuará após a instrução que causou o erro, assim como faria sem break ou continue. Com a continue palavra-chave, no entanto, o PowerShell não grava um erro no fluxo de erros.
A seguinte função de exemplo usa a palavra-chave continue em uma instrução trap.
function continue_example {
trap {
"Error trapped"
continue
}
1/$null
"Function completed."
}
continue_example
Error trapped
Function completed.
A função é retomada depois que o erro é interceptado e a instrução "Função concluída" é executada. Nenhum erro é gravado no fluxo de erros.
Anotações
trap fornecem uma maneira simples de garantir amplamente que todos os erros de encerramento dentro de um escopo sejam tratados. Para um tratamento de erros mais refinado, use blocos try/catch onde armadilhas são definidas usando declarações catch. As instruções catch se aplicam apenas ao código dentro da instrução try associada. Para obter mais informações, consulte about_Try_Catch_Finally.