ErrorAction e preferências
Esta aula aborda o controle de erros no PowerShell, explicando como usar o parâmetro -ErrorAction, a variável de preferência $ErrorActionPreference e o parâmetro -ErrorVariable. Inclui exemplos práticos e boas práticas para gerenciar erros de forma eficiente.
No PowerShell, erros podem interromper ou silenciosamente atrapalhar seus scripts. Para ter controle fino sobre como os erros são tratados, o PowerShell oferece mecanismos como o parâmetro -ErrorAction, a variável de preferência $ErrorActionPreference e o parâmetro -ErrorVariable. Entender esses conceitos é essencial para escrever scripts robustos e previsíveis.
Nesta aula, você aprenderá a configurar a ação padrão para erros, como sobrescrevê-la em comandos específicos e como capturar informações de erro para análise posterior. Vamos explorar cada um desses tópicos com exemplos práticos.
-ErrorAction
O parâmetro -ErrorAction permite definir como um cmdlet específico deve responder a erros não-terminantes. Os valores possíveis são: Stop, Continue, SilentlyContinue, Inquire e Ignore. Esse parâmetro substitui a configuração global da variável $ErrorActionPreference para aquele comando.
Exemplo: ao tentar ler um arquivo inexistente, podemos optar por parar o script (Stop) ou ignorar o erro silenciosamente (SilentlyContinue).
Get-Item -Path "C:\ArquivoInexistente.txt" -ErrorAction StopNesse caso, o erro será tratado como terminante (mesmo sendo não-terminante), interrompendo a execução. Se usássemos SilentlyContinue, o erro seria suprimido e o script continuaria.
$ErrorActionPreference
A variável de preferência $ErrorActionPreference define o comportamento padrão para todos os comandos no escopo atual (script, função ou global). As opções são as mesmas do parâmetro -ErrorAction. Por padrão, seu valor é Continue, que exibe o erro e continua a execução.
Alterar essa variável é útil para mudar o comportamento global. Por exemplo, em scripts críticos, pode-se definir $ErrorActionPreference = 'Stop' para que qualquer erro pare a execução. No entanto, é importante restaurar o valor original após o uso, especialmente em scripts que afetam o escopo global.
$originalPref = $ErrorActionPreference
$ErrorActionPreference = 'Stop'
try {
Get-Item -Path "C:\ArquivoInexistente.txt"
} catch {
Write-Host "Erro capturado: $_"
} finally {
$ErrorActionPreference = $originalPref
}Note que, ao usar Stop, os erros não-terminantes se tornam terminantes e podem ser capturados com try/catch. Isso é uma prática comum para tratamento de erros.
-ErrorVariable
O parâmetro -ErrorVariable permite armazenar os erros gerados por um comando em uma variável específica, sem interromper a execução. É útil para inspecionar ou registrar erros após a execução do comando.
Exemplo:
Get-Item -Path "C:\ArquivoInexistente.txt" -ErrorVariable erros
if ($erros) {
Write-Host "Ocorreram $(($erros).Count) erro(s):"
foreach ($erro in $erros) {
Write-Host $erro.Exception.Message
}
}A variável $erros conterá uma lista de objetos de erro. É importante notar que, por padrão, a variável armazena apenas erros do comando atual; para acumular erros de múltiplos comandos, use + antes do nome (ex.: -ErrorVariable +erros).
Exemplo com acumulação:
$erros = @()
Get-Item -Path "C:\ArquivoInexistente.txt" -ErrorVariable +erros
Get-Item -Path "C:\OutroArquivoInexistente.txt" -ErrorVariable +erros
Write-Host "Total de erros: $($erros.Count)"Boas práticas
Ao trabalhar com tratamento de erros no PowerShell, siga estas recomendações:
- Use
try/catchcom$ErrorActionPreference = 'Stop': para erros não-terminantes que você deseja tratar como exceções, mude a preferência paraStope capture comcatch. Lembre-se de restaurar a preferência original. - Evite
SilentlyContinueindiscriminadamente: suprimir erros pode ocultar problemas reais. Use apenas quando tiver certeza de que o erro é esperado e não crítico. - Utilize
-ErrorVariablepara logging: armazene erros em variáveis para registrar ou exibir detalhadamente, sem interromper o fluxo. - Prefira
Stopem scripts críticos: em scripts que exigem execução precisa, como automação de infraestrutura, defina$ErrorActionPreference = 'Stop'para evitar falhas silenciosas. - Documente o comportamento esperado: ao publicar scripts, indique como os erros são tratados para que outros usuários entendam o fluxo.
Referências
- About Preference Variables - ErrorActionPreference
- About Try Catch Finally
- About Common Parameters - ErrorAction
- About Common Parameters - ErrorVariable
- Everything About Exceptions
Exercícios
Escreva um comando que tente ler um arquivo
teste.txte, se o arquivo não existir, pare a execução imediatamente usando-ErrorAction.✓ Resposta:Get-Item -Path "teste.txt" -ErrorAction StopDefina a variável
$ErrorActionPreferenceparaSilentlyContinuee execute um comando que gere um erro. Em seguida, restaure o valor padrão.✓ Resposta:$originalPref = $ErrorActionPreference $ErrorActionPreference = 'SilentlyContinue' Get-Item -Path "arquivo_inexistente.txt" $ErrorActionPreference = $originalPrefUse
-ErrorVariablepara capturar o erro de um comando que tenta acessar um caminho inválido e exiba a mensagem de erro.✓ Resposta:Get-Item -Path "C:\PastaInexistente" -ErrorVariable meuErro if ($meuErro) { Write-Host $meuErro[0].Exception.Message }Crie um script que tente ler dois arquivos, acumulando os erros em uma mesma variável usando
-ErrorVariablecom+.✓ Resposta:$erros = @() Get-Item -Path "arq1.txt" -ErrorVariable +erros Get-Item -Path "arq2.txt" -ErrorVariable +erros Write-Host "Erros acumulados: $($erros.Count)"Combine
$ErrorActionPreference = 'Stop'comtry/catchpara capturar um erro de arquivo não encontrado e exibir uma mensagem personalizada.✓ Resposta:$originalPref = $ErrorActionPreference $ErrorActionPreference = 'Stop' try { Get-Item -Path "arquivo_inexistente.txt" } catch { Write-Host "Erro capturado: $_" } finally { $ErrorActionPreference = $originalPref }