Pular para o conteúdo principal

Tratamento de Exceções

O tratamento de exceções é uma parte fundamental da programação, permitindo lidar com erros e situações inesperadas de forma controlada. Vamos estudar como lidar com exceções em Ruby.

Para obter informações sobre os tipos de exceção disponíveis em Ruby, você pode consultar a documentação oficial de exceções. Essa documentação lista os diferentes tipos de exceção, suas descrições e hierarquias.

Bloco begin, rescue e end​

Podemos utilizar o bloco begin, rescue e end para capturar exceções e executar um bloco de código alternativo quando um erro ocorre.

Antes, vamos fazer uma continha simples:

resultado = 10 / 0

E é assim que você explode o seu terminal. ou só recebe um "main.rb:1:in `/': divided by 0 (ZeroDivisionError)", mas é parecido

Lidaremos com isso de uma forma um pouco melhor:

begin
resultado = 10 / 0 # isso causará uma exceção, que podemos intervir com 'rescue'
rescue ZeroDivisionError
puts "Erro de divisão por zero!" # aqui nós inserimos o código de tratamento, no caso, uma mensagem.
end

Tratamento de exceções em cadeia​

O estagiário estava aprendendo ruby, mas mesmo com o 'tratamento de erros' que ele aprendeu alguma coisa ainda estava errada.

begin
resultado = 10 / 0.to_s
rescue ZeroDivisionError
puts "Erro de divisão por zero!"
end

# Output:
# main.rb:2:in `/': String can't be coerced into Integer (TypeError)
# from main.rb:2:in `<main>'
# exit status 1

Então, pra salvar o emprego do coitado, a gente salva a vida dele. Por enquanto...

begin
resultado = 10 / 0.to_s
rescue ZeroDivisionError
puts "Erro de divisão por zero!"
rescue TypeError => e
puts "Erro: #{e}"
end

# Output:
# Erro: String can't be coerced into Integer

E em caso de necessidade de dar um passo a mais:

begin
erro_acessado = nil
resultado = 10 / 0.to_s
rescue ZeroDivisionError
erro_acessado = 1
puts "Erro de divisão por zero!"
raise "Erro interno!"
rescue TypeError => e
erro_acessado = 2
puts "Um erro de Tipo ocorreu: #{e.message}"
ensure # Esta parte sempre será executada
puts "Fim da execução. Erro: #{erro_acessado}"
end

Lançando uma exceção pré-definida​

As vezes, o levantamento de erros pode salvar a sua vida, evitar que o sistema continue executando um código com dados que você não deseja, evitar uma sobrecarga, um delete com where incorreto. Para evitar essa dor de cabeça, fazemos:

def dividir(a, b)
raise ZeroDivisionError, "Divisão por zero!" if b == 0
a / b
end

begin
resultado = dividir(10, 0)
rescue StandardError => e
puts "Erro: #{e.message}" # Output: "Erro: Divisão por zero!"
end

Lançando uma exceção Personalizada​

No ruby, você sempre tem espaço para ir além. Se você precisa muito de um novo formato de erro, sabe que vai utilizar várias vezes, por exemplo, você pode simplesmente personalizá-lo!

class MeuErroPersonalizado < StandardError
end

def meu_metodo
raise MeuErroPersonalizado, "Isso é um erro personalizado!"
end

begin
meu_metodo
rescue MeuErroPersonalizado => e
puts "Erro personalizado: #{e.message}"
end

O tratamento de exceções em Ruby é uma ferramenta poderosa para lidar com erros de forma elegante e controlada. Lembre-se de que é uma boa prática ser específico ao capturar exceções e evitar capturar todas as exceções com rescue Exception, a menos que você saiba exatamente o que está fazendo.

Com isso adquirimos compreensão dos tratamentos de exceções em Ruby. Espero que tenha entendido bem, e que isso possa ajudar nos futuros projetos que você com certeza vai se bem suceder!