Menu
Coddy logo textTech

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 arquivo

raise é 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
end

A 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.

challenge icon

Desafio

Fácil

Defina um método safe_divide(a, b) que:

  • Gera ArgumentError com a mensagem "b cannot be zero" se b == 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, imprima Error: <message>
  • Em ensure, sempre imprima Done.

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.
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

Pratique por conta própria: Compilador de Ruby online