Em Ruby, tal como em muitas linguagens, as exceções são uma forma de lidar com acontecimentos inesperados. Um tratamento adequado das exceções é importante para evitar que o teu programa vá abaixo.
Quando é lançada uma exceção, seja porque a lançamos explicitamente, seja porque o intérprete de Ruby a lança, o programa desvia-se do funcionamento normal e acaba por terminar com uma mensagem de erro:
raise ArgumentError.new("Something went wrong!")
=> Traceback (most recent call last):
.
.
ArgumentError (Something went wrong!)
1/0
=> Traceback (most recent call last):
.
.
ZeroDivisionError (divided by 0)
Se quisermos travar este processo de encerramento, precisamos de reagir à exceção. A isto chama-se fazer rescue de uma exceção:
begin
# ...any code that raises an exception
rescue
puts 'Got an exception'
end
Este programa não vai abaixo e imprime «Got an exception». Em vez de terminar, o Ruby executa o código do bloco rescue, que imprime uma mensagem.
Tal como tudo em Ruby, as exceções também são objetos e normalmente contêm dados sobre a exceção. É assim que podemos obter o objeto da exceção:
begin
# ...any code that raises an exception
rescue => e
puts "Exception class: #{ e.class.name }"
puts "Exception Message:#{e.message}"
end
Em Ruby também é possível lançar as tuas próprias exceções. Por exemplo:
begin
raise ArgumentError.new("Invalid argument")
rescue ArgumentError => e
puts e.message
end
A exceção anterior é uma das exceções incorporadas no Ruby, mas também é possível definir exceções personalizadas e lançá-las:
class CustomError < StandardError
end
raise CustomError.new("Something went wrong")
Neste exercício vais construir o tratamento de erros de uma calculadora simples.
O objetivo é teres uma calculadora funcional que devolve uma string com o seguinte padrão: 16 + 51 = 67, quando recebe os argumentos 16, 51 e +.
SimpleCalculator.calculate(16, 51, "+")
# => "16 + 51 = 67"
SimpleCalculator.calculate(32, 6, "*")
# => "32 * 6 = 192"
SimpleCalculator.calculate(512, 4, "/")
# => "512 / 4 = 128"
calculate
O método principal a implementar nesta tarefa será o método de classe SimpleCalculator.calculate().
Recebe três argumentos.
Os dois primeiros argumentos são números sobre os quais vai ser realizada uma operação.
O terceiro argumento é do tipo string e, para este exercício, é necessário implementar as seguintes operações:
+
*
/
Atualiza o método SimpleCalculator.calculate() para lançar uma exceção UnsupportedOperation quando o símbolo da operação é desconhecido.
SimpleCalculator.calculate(1, 2, '-')
# => Raises an UnsupportedOperation
Neste exercício, espera-se que definas a exceção UnsupportedOperation para um âmbito específico.
Atualiza o método SimpleCalculator.calculate() para lançar uma exceção ArgumentError quando os tipos dos argumentos são inválidos.
SimpleCalculator.calculate(1, '2', '*')
# => Raises an ArgumentError
Atualiza o SimpleCalculator.calculate() para tratar exceções ZeroDivisionError.
O código de tratamento deve devolver a string com o conteúdo Division by zero is not allowed..
Qualquer outra exceção não deve ser tratada pelo método SimpleCalculator.calculate().
SimpleCalculator.calculate(512, 0, "/")
# => returns "Division by zero is not allowed."
Inscreve-te no Exercism para aprenderes e dominares Ruby com 21 conceitos121 exercícios, e mentoria humana real, tudo grátis.