Menu
Coddy logo textTech

begin / rescue

Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy — lição 44 de 56.

Para evitar que uma exceção interrompa seu programa, envolva o código arriscado em begin ... rescue ... end. Se algo dentro de begin lançar uma exceção, o Ruby pula para o bloco rescue correspondente em vez de abortar.

begin
  result = 10 / 0
  puts result
rescue ZeroDivisionError
  puts "Cannot divide by zero!"
end
# Não é possível dividir por zero!

Você pode capturar o próprio objeto de exceção com => e e ler sua .message:

begin
  Integer("hello")
rescue ArgumentError => e
  puts "Bad input: #{e.message}"
end
# Entrada inválida: valor inválido para Integer(): "hello"

Se você não nomear uma classe de exceção, o rescue por si só captura o StandardError e seus descendentes, a maioria das falhas cotidianas. A captura é mais útil quando você pode fazer algo no bloco rescue: substituir por um valor padrão, registrar o problema, perguntar ao usuário novamente.

challenge icon

Desafio

Fácil

Leia duas linhas da entrada, ambas devem ser inteiros, mas a segunda pode não ser um número válido.

Envolva a análise da segunda linha em begin / rescue:

  • Use Integer(input) (que gera ArgumentError em uma string inválida)
  • Se a análise for bem-sucedida, imprima Sum: <a + b>
  • Se falhar, imprima Bad number!

Para a entrada 3 e depois 4, a saída é Sum: 7. Para 3 e depois abc, é Bad number!.

Folha de consulta

Use begin ... rescue ... end para tratar exceções sem interromper a execução:

begin
  result = 10 / 0
rescue ZeroDivisionError
  puts "Cannot divide by zero!"
end

Capture o objeto da exceção com => e para acessar sua mensagem:

begin
  Integer("hello")
rescue ArgumentError => e
  puts "Bad input: #{e.message}"
end

O uso de rescue sem uma classe captura StandardError e seus descendentes.

Experimente você mesmo

a = gets.to_i
raw_b = gets.chomp

# TODO: begin/rescue em volta de Integer(raw_b); imprimir a soma ou "Bad number!"
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e Fluxo