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 kit de ferramentas de tratamento de erros.
ensure é um bloco que executa não importa o que aconteça, seja se o begin terminou normalmente, ou se um ramo rescue capturou uma exceção, ou mesmo se a exceção não foi capturada. É onde 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
# capturado
# 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
# ... realize o saque
endA convenção é usar raise cedo, no topo de um método, para falhar rapidamente quando os argumentos estiverem incorretos. O chamador pode usar rescue se tiver uma recuperação sensata, ou deixar que o erro se propague.
Desafio
FácilDefina um método safe_divide(a, b) que:
- Lança
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> - No
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.Folha de consulta
ensure executa não importa o que aconteça (saída normal, resgatada ou exceção não capturada) — use-o para limpeza:
begin
raise "something broke"
rescue
puts "caught it"
ensure
puts "always runs"
endraise cria uma exceção. Passe uma classe e uma mensagem para lançar um tipo específico:
raise ArgumentError, "amount must be positive" if amount <= 0Convenção: use o raise logo no início de um método para falhar rapidamente em caso de argumentos inválidos.
Experimente você mesmo
# TODO: definir safe_divide(a, b), lança ArgumentError quando b == 0
a = gets.to_i
b = gets.to_i
# TODO: begin ... imprimir Result; rescue ArgumentError => e ... imprimir Error; ensure ... imprimir 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 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