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!