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.
Desafio
FácilLeia 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 geraArgumentErrorem 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!"
endCapture o objeto da exceção com => e para acessar sua mensagem:
begin
Integer("hello")
rescue ArgumentError => e
puts "Bad input: #{e.message}"
endO 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!"
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