ensure e raise
Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy. Lição 46 de 56.
Mais duas peças completam o conjunto de ferramentas de tratamento de erros.
ensure é um bloco que é executado aconteça o que acontecer, independentemente de begin ter terminado normalmente, de uma ramificação rescue ter capturado uma exceção ou até mesmo de a exceção não ter sido capturada. É nesse bloco que você coloca o código de limpeza:
begin
puts "opening file"
raise "something broke"
rescue
puts "caught it"
ensure
puts "closing file"
end
# abrindo arquivo
# peguei
# fechando arquivoraise é como você cria sua própria exceção. Passe uma string para a mensagem ou uma classe mais uma mensagem:
def withdraw(amount)
raise ArgumentError, "amount must be positive" if amount <= 0
# ... faça o saque
endA convenção é raise logo no início, no começo de um método, para falhar rapidamente quando os argumentos estão incorretos. Quem chama pode usar rescue se tiver uma recuperação adequada ou deixar o erro se propagar.
Desafio
FácilDefina um método safe_divide(a, b) que:
- Gera
ArgumentErrorcom a mensagem"b cannot be zero"seb == 0 - Caso contrário, retorna
a / b
Em seguida, leia dois inteiros da entrada. Chame safe_divide dentro de begin / rescue / ensure:
- Em caso de sucesso, imprima
Result: <value> - Em caso de
ArgumentError, imprimaError: <message> - Em
ensure, sempre imprimaDone.
Para a entrada 10 / 2, a saída é:
Result: 5
Done.Para a entrada 10 / 0:
Error: b cannot be zero
Done.Experimente você mesmo
# TODO: defina safe_divide(a, b), lança ArgumentError quando b == 0
a = gets.to_i
b = gets.to_i
# TODO: begin ... print Result; rescue ArgumentError => e ... print Error; ensure ... print Done.
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 em Profundidade
Visão Geral dos Métodos de StringInterpolação de StringsPercorrendo StringsDividir e UnirRecapitulação - String Weaver4Blocos, Procs e Lambdas
O que é um Bloco?do..end vs ChavesA Palavra-chave yieldParâmetros de BlocoProcs e LambdasRevisão - Iterador Personalizado7Hashes - Parte 2
Hash.new com Valores PadrãoIterando sobre 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 / WhenRevisão - Prática com intervalos5Potência do Enumerable
Select e RejectEncadeando MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRecapitulação - Pipeline de Dados3Arrays 2D
Fundamentos de Arrays 2DAcessando elementos 2DPercorrendo Arrays 2DPadrões comuns em 2DRecapitulaçã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 SeguraPratique por conta própria: Compilador de Ruby online