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."
endA 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}"
endUse isso quando o código de recuperação for o mesmo para diversos modos de falha.
Desafio
FácilLeia 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→ imprimaBad number!ZeroDivisionError→ imprimaCannot divide by zero!TypeError→ imprimaWrong 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."
endListe 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
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
1Strings a Fundo
Visão Geral de Métodos de StringInterpolação de StringsIterando sobre StringsSplit e JoinRecapitulação - String Weaver4Blocos, Procs e Lambdas
O que é um Bloco?do..end vs ChavesA palavra-chave yieldParâmetros de BlocoProcs e LambdasRecapitulação - Iterador Customizado7Hashes Parte 2
Hash.new com Valores PadrãoIterando em HashesHashes AninhadosMesclando e TransformandoRecapitulação - Contador de Frequência10Projeto - Registros de Alunos
Visão Geral do ProjetoAdicionar Aluno2Intervalos
O que é um Intervalo?Métodos de IntervaloIntervalos em Case / WhenRecapitulação - Prática com Intervalos5O Poder do Enumerable
Select e RejectEncadeando o MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRecapitulação - Data Pipeline3Arrays 2D
Fundamentos de Arrays 2DAcessando Elementos 2DIterando sobre Arrays 2DPadrões 2D ComunsRecapitulação - Operações com Matrizes6Projeto - Gerenciador de Biblioteca
Visão Geral do ProjetoAdicionar Livro9Tratamento de Erros
O que é uma Exceção?begin / rescueMúltiplas Cláusulas rescueensure e raiseRecapitulação - Calculadora Segura