DEV Community

1

Introdução ao tratamento de erros

Seguindo com os tutoriais para iniciantes em Powershell, recomendo a leitura do anterior pois vamos seguir dele, vamos conversar um pouco sobre o tratamento de erros. Existem varias formas de fazer isso, mas como o foco são os principiantes vamos sempre pensar na abordagem com um bom custo beneficio entre a entrega e a curva de aprendizagem.

Para tratarmos erros, vamos usar a estrutura Try-Catch, ela funciona de uma forma bem simples.
Vamos criar dois blocos, o TRY onde colocamos o que queremos fazer e o CATCH, onde colocamos a mensagem de erro que queremos mostrar, no caso de algum procedimento descrito no bloco anterior falhar.

Para exemplificar ele, vamos continuar com o nosso jeito difícil de validar caminhos. A ideia que aplicaremos aqui, é no caso de qualquer problema, retornarmos uma mensagem de erro.

Traduzindo isso para código, teremos:

# Limpamos a tela para facilitar a visualização
Clear-Host
# Receber o local e armazenar em uma variável chamada Local
$Local = Read-Host "Informe o local onde quer criar a pasta"
# Receber o nome da pasta e armazenar na variável nomePasta
$nomePasta = Read-Host "Informe um nome para a pasta"
try {
# Vamos começar com as validações
$listaPastas = Get-ChildItem -Path $Local -Directory # Recebemos todas as pastas dentro de um caminho, junto com todas as informações dela
# Como podemos ter varias pastas, teremos que criar um loop, verificando item a item de nossa lista
foreach ($pasta in $listaPastas) {
$pasta = $pasta.name # Como queremos validar apenas o nome da pasta, utilizaremos apenas a propriedade NAME
# Para compararmos valores, utilizamos o parametro -eq
if ($nomePasta -eq $pasta) {
$pastaValidacao = "Existe" # Se encontrarmos uma pasta com o mesmo nome, atribuimos o valor Existe para nossa variavel de validacao
}
}
}
catch {
# Recebemos a mensagem de erro e armazenamos em uma variavel
$mensagemErro = $_.Exception.Message
# Limpamos a tela e exibimos a mensagem de erro
Clear-Host
Write-Host "Erro ao tentar criar a pasta $nomePasta"
Write-Host "$mensagemErro"
}
# Se ela já existe, exibimos uma mensagem de erro
if ($pastaValidacao -eq "Existe") {
# Informamos que a pasta já existe
Clear-Host # Limpamos a tela para deixar mais bonito
Write-Host "A pasta $nomePasta já existe no caminho $Local"
}
# Se a pasta nao existe, executamos o bloco de codigo
else {
# Executar o comando de criação de pasta
New-Item -Path "$Local/$nomePasta" -ItemType "Directory"
# Mostrar mensagem de confirmação na tela
Clear-Host # Limpamos a tela para deixar mais bonito
Write-Host "A pasta $nomePasta foi criada em $Local"
}

Nossa validação de erros está funcionando, como podemos ver nesse retorno quando informei um caminho que não existia:
Retorno Catch

Mas caso tenha apenas executado nosso script, provavelmente não viu essa mensagem, uma vez que não estamos dando qualquer tratamento a continuidade do script caso tenhamos problemas.

Existem algumas formas de sairmos disso, mas utilizaremos aqui a mais simples e frustrante possível para o usuário.
Vamos apenas quebrar o script depois de que mostrarmos o erro.
Faremos isso por meio do combo PAUSE + EXIT, com o primeiro comando vamos pausar a tela para que seja possível ler o que está escrito, e com o segundo iremos fechar o prompt.

Essa abordagem não é a melhor, mas aproveitaremos esse momento para conhecer esses dois comandos e essa possibilidade, já que em alguns momentos, fara sentido pausar ou apenas encerrar tudo.

Adicionaremos o combo em nosso catch, que terminará dessa forma:

# Limpamos a tela para facilitar a visualização
Clear-Host
# Receber o local e armazenar em uma variável chamada Local
$Local = Read-Host "Informe o local onde quer criar a pasta"
# Receber o nome da pasta e armazenar na variável nomePasta
$nomePasta = Read-Host "Informe um nome para a pasta"
try {
# Vamos começar com as validações
$listaPastas = Get-ChildItem -Path $Local -Directory # Recebemos todas as pastas dentro de um caminho, junto com todas as informações dela
# Como podemos ter varias pastas, teremos que criar um loop, verificando item a item de nossa lista
foreach ($pasta in $listaPastas) {
$pasta = $pasta.name # Como queremos validar apenas o nome da pasta, utilizaremos apenas a propriedade NAME
# Para compararmos valores, utilizamos o parametro -eq
if ($nomePasta -eq $pasta) {
$pastaValidacao = "Existe" # Se encontrarmos uma pasta com o mesmo nome, atribuimos o valor Existe para nossa variavel de validacao
}
}
}
catch {
# Recebemos a mensagem de erro e armazenamos em uma variavel
$mensagemErro = $_.Exception.Message
# Limpamos a tela e exibimos a mensagem de erro
Clear-Host
Write-Host "Erro ao tentar criar a pasta $nomePasta"
Write-Host "$mensagemErro"
Pause # Utilizamos isso para aguardarmos um retorno do usuario
Exit # Encerramos o terminal
}
# Se ela já existe, exibimos uma mensagem de erro
if ($pastaValidacao -eq "Existe") {
# Informamos que a pasta já existe
Clear-Host # Limpamos a tela para deixar mais bonito
Write-Host "A pasta $nomePasta já existe no caminho $Local"
}
# Se a pasta nao existe, executamos o bloco de codigo
else {
# Executar o comando de criação de pasta
New-Item -Path "$Local/$nomePasta" -ItemType "Directory"
# Mostrar mensagem de confirmação na tela
Clear-Host # Limpamos a tela para deixar mais bonito
Write-Host "A pasta $nomePasta foi criada em $Local"
}

Como retorno, teremos a mensagem:
PAUSE

E assim que apertarmos enter, o terminal será encerrado.

Temos alguns pontos de atenção sobre o que vimos hoje, o primeiro está relacionado ao idioma da mensagem, ele vai variar conforme a do sistema. O idioma do sistema será o idioma do retorno do erro.

O outro ponto, é a mensagem de erro em si, que para essa situação acabou não sendo muito clara, informando apenas que não conseguiu localizar algo com o atributo Diretório.

É possível tratar essas mensagens, mas o objetivo aqui não é se aprofundar tanto sobre cada componente, por isso recomendo que pesquise mais sobre como implementar o Try-Catch no Powershell.

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay