Menu
Coddy logo textTech

Múltiplas Cláusulas rescue

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

Um bloco begin pode ter várias cláusulas rescue. O Ruby as verifica de cima para baixo e executa a primeira cuja classe de exceção corresponda.

begin
  number = Integer(gets.chomp)
  result = 100 / number
  puts result
rescue ArgumentError
  puts "That's not a valid number."
rescue ZeroDivisionError
  puts "Can't divide by zero."
end

A ordem importa: liste classes específicas antes das genéricas. StandardError colocado primeiro capturaria tudo e os ramos posteriores nunca seriam executados.

Você também pode capturar múltiplas classes de exceção em um único bloco listando-as com vírgulas:

begin
  risky_call
rescue ArgumentError, TypeError => e
  puts "Bad input: #{e.message}"
end

Use isso quando o código de recuperação for o mesmo para diversos modos de falha.

challenge icon

Desafio

Fácil

Leia duas linhas da entrada, ambas destinadas a serem inteiros. Use Integer(...) para ambas, depois divida a primeira pela segunda.

Trate três casos com ramificações rescue separadas:

  • ArgumentError → imprima Bad number!
  • ZeroDivisionError → imprima Cannot divide by zero!
  • TypeError → imprima Wrong type!

Se tudo funcionar, imprima Result: <a / b> (divisão inteira).

Para a entrada 10 / 2, a saída é Result: 5. Para 10 / 0, Cannot divide by zero!. Para 10 / abc, Bad number!.

Folha de consulta

Um bloco begin pode ter múltiplas cláusulas rescue — o Ruby as compara de cima para baixo:

begin
  number = Integer(gets.chomp)
  result = 100 / number
  puts result
rescue ArgumentError
  puts "That's not a valid number."
rescue ZeroDivisionError
  puts "Can't divide by zero."
end

Liste classes de exceção específicas antes das genéricas — uma classe genérica como StandardError colocada primeiro engoliria todos os ramos subsequentes.

Capture múltiplas classes de exceção em um único ramo separando-as com vírgulas:

rescue ArgumentError, TypeError => e
  puts "Bad input: #{e.message}"

Experimente você mesmo

raw_a = gets.chomp
raw_b = gets.chomp

# TODO: begin ... rescue ArgumentError ... rescue ZeroDivisionError ... rescue TypeError ... end
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