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 Stop

Nesse 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/catch com $ErrorActionPreference = 'Stop': para erros não-terminantes que você deseja tratar como exceções, mude a preferência para Stop e capture com catch. Lembre-se de restaurar a preferência original.
  • Evite SilentlyContinue indiscriminadamente: suprimir erros pode ocultar problemas reais. Use apenas quando tiver certeza de que o erro é esperado e não crítico.
  • Utilize -ErrorVariable para logging: armazene erros em variáveis para registrar ou exibir detalhadamente, sem interromper o fluxo.
  • Prefira Stop em 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

Exercícios

  1. Escreva um comando que tente ler um arquivo teste.txt e, se o arquivo não existir, pare a execução imediatamente usando -ErrorAction.

    ✓ Resposta:
    Get-Item -Path "teste.txt" -ErrorAction Stop
  2. Defina a variável $ErrorActionPreference para SilentlyContinue e 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 = $originalPref
  3. Use -ErrorVariable para 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 }
  4. Crie um script que tente ler dois arquivos, acumulando os erros em uma mesma variável usando -ErrorVariable com +.

    ✓ Resposta:
    $erros = @()
    Get-Item -Path "arq1.txt" -ErrorVariable +erros
    Get-Item -Path "arq2.txt" -ErrorVariable +erros
    Write-Host "Erros acumulados: $($erros.Count)"
  5. Combine $ErrorActionPreference = 'Stop' com try/catch para 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
    }