about_Trap
Descrição breve
Descreve uma palavra-chave que lida com um erro de encerramento.
Descrição longa
Um erro de encerramento interrompe a execução de uma instruçã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 outras linguagens, como C#, os erros de encerramento são conhecidos como exceções.
A trap
palavra-chave especifica uma lista de instruções a serem executadas quando ocorre um erro de encerramento. trap
As instruções podem lidar com os erros de encerramento das seguintes maneiras:
Exiba o erro após processar o
trap
bloco de instruções e continuar a execução do script ou 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
if
instrução ouforeach
loop, as instruções no bloco são executadas e atrap
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
trap
trap
usobreak
na instrução.Silencie o erro, mas continue a execução do script ou da função que
continue
contém otrap
using natrap
instrução.
A lista de instruções do trap
pode incluir várias condições ou chamadas de função. A trap
pode gravar logs, condições de teste ou até mesmo executar outro programa.
Sintaxe
A instrução trap
utiliza esta sintaxe:
trap [[<error type>]] {<statement list>}
A trap
instrução inclui uma lista de instruções a serem executadas quando ocorre um erro de encerramento. Uma trap
instrução consiste na trap
palavra-chave, opcionalmente seguida por uma expressão de tipo, e no bloco de instruções 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 as trap
capturas.
Um script ou comando pode ter várias trap
instruções. trap
As instruções podem aparecer em qualquer lugar no script ou comando.
Interceptando 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 trap
instrução estiver presente, o trap
PowerShell continuará executando o script ou comando na instrução.
O exemplo a seguir é uma instrução mínima trap
:
trap { 'Error found.' }
Essa trap
instrução 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 a seguinte saída:
Error found.
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.
At line:3 char:5
+ nonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
O exemplo a seguir inclui uma trap
instrução 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 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 : 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.
At line:3 char:5
+ nonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Importante
trap
As instruções podem ser definidas em qualquer lugar dentro de um determinado bloco de script, mas sempre se aplicam a todas as instruções nesse bloco de script. Em tempo de execução, trap
as instruções em um bloco são definidas antes que quaisquer outras instruções sejam executadas.
Em JavaScript, isso é conhecido como içamento. 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, definir um trap
no final de um script e lançar um erro na primeira instrução ainda aciona que trap
.
Interceptando erros específicos
Um script ou comando pode ter várias trap
instruções. A trap
pode ser definido para lidar com erros específicos.
O exemplo a seguir é uma trap
instrução 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 Command error trapped
cadeia de caracteres.
Depois de executar a lista de trap
instruções, o PowerShell grava o objeto de erro no fluxo de erros e continua o script.
O PowerShell usa tipos de exceção do .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 todos os erros gerados por comandos desconhecidos. Ele também intercepta 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 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.
At line:1 char:1
+ nonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
System.Management.Automation.CommandNotFoundException
Você pode ter mais de uma trap
instrução em um script. Apenas uma trap
instrução pode interceptar cada tipo de erro. Quando ocorre um erro de encerramento, o PowerShell procura a trap
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 intercepta qualquer erro de encerramento e uma instrução específica trap
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 : 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.
At line:5 char:1
+ nonsenseString}
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Como o PowerShell não reconhece "nonsenseString" como um cmdlet ou outro item, ele retorna um erro CommandNotFoundException . A instrução específica trap
intercepta esse erro de encerramento.
O exemplo de script a seguir contém as mesmas trap
instruções 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
Attempted to divide by zero.
At line:5 char:1
+ 1/$null}
+ ~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
A tentativa de dividir por zero não cria um erro CommandNotFoundException . A outra trap
instrução, que intercepta qualquer erro de encerramento, intercepta a divisão por erro zero.
Erros de interceptação 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 trap
bloco é 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 trap
e a 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!
Attempted to divide by zero.
At line:3 char:4
+ 1/$x
+ ~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
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 gera um erro de encerramento. O script ignora o restante do foreach
bloco de script, executa a try
instrução e continua após o foreach
bloco de script.
Erros de interceptação e escopo
Se ocorrer um erro de encerramento no mesmo bloco de script 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 bloco de script diferente do erro, a execução continuará na próxima instrução que estiver no mesmo bloco de script que a trap
instrução.
Por exemplo, se ocorrer um erro em uma função e a trap
instrução estiver na função, o script continuará na próxima instrução. O script a seguir contém um erro e uma trap
instrução:
function function1 {
trap { 'An error: ' }
NonsenseString
'function1 was completed'
}
function1
A execução desse script produz o seguinte resultado:
An error:
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.
At line:3 char:5
+ NonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (NonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
function1 was completed
A trap
instrução 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 após a trap
instrução.
Compare esse comportamento com o exemplo a seguir, que tem o mesmo erro e trap
instrução. Neste exemplo, a trap
instrução ocorre fora da função:
function function2 {
NonsenseString
'function2 was completed'
}
trap { 'An error:' }
function2
A execução da Function2
função produz o seguinte resultado:
An error:
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.
At line:2 char:5
+ NonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (NonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Neste exemplo, o function2 was completed
comando não foi executado. Em ambos os exemplos, o erro de encerramento ocorre dentro da função. Neste exemplo, no entanto, a trap
instrução 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 bloco de script) é usada.
No exemplo a seguir, apenas o trap
with whoops 1
é executado.
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { 'whoops 1'; continue }
trap { 'whoops 2'; continue }
Importante
Uma trap
instrução tem como escopo onde ela é compilada. Se você tiver uma trap
instrução dentro de uma função ou script de origem de ponto, quando a função ou o script de origem de ponto for encerrado, todas as trap
instruções dentro serão removidas.
Usando as palavras-chave break e continue
Você pode usar as break
palavras-chave and continue
em uma trap
instrução para determinar se um script ou comando continua a ser executado após um erro de encerramento.
Se você incluir uma break
instrução em uma lista de trap
instruções, o PowerShell interromperá a função ou o script. A função de exemplo a seguir usa a break
palavra-chave em uma trap
instrução:
function break_example {
trap {
'Error trapped'
break
}
1/$null
'Function completed.'
}
break_example
Error trapped
Attempted to divide by zero.
At line:6 char:5
+ 1/$null
+ ~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorR
ecordException
+ FullyQualifiedErrorId : RuntimeException
Como a trap
instrução incluiu a break
palavra-chave, a função não continua a ser executada e a Function completed
linha não é executada.
Se você incluir uma continue
palavra-chave em uma trap
instrução, o PowerShell será retomado 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 função de exemplo a seguir usa a continue
palavra-chave em uma trap
instrução:
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 é interceptado e a End of function
instrução é executada. Nenhum erro é gravado no fluxo de erros.
Observações
trap
fornecem uma maneira de garantir que todos os erros de encerramento em um bloco de script sejam tratados. Para um tratamento de erros mais refinado, use try
/catch
blocos em que as armadilhas são definidas usando catch
instruções. As catch
instruções só se aplicam ao código dentro da instrução associada try
. Para obter mais informações, consulte about_Try_Catch_Finally.