Винятки в Ruby, як і в багатьох інших мовах, дають змогу працювати з непередбачуваними подіями. Належна обробка винятків важлива, коли ми намагаємося вберегти свою програму від аварійного завершення.
Коли виникає виняток, байдуже, викликали ми його явно чи його викликав інтерпретатор Ruby, програма збивається зі звичного ходу роботи й зрештою завершується, виводячи повідомлення про помилку:
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)
Якщо ж ми хочемо зупинити це аварійне завершення, нам потрібно відреагувати на виняток. Це називається «рятуванням» винятку:
begin
# ...any code that raises an exception
rescue
puts 'Got an exception'
end
Ця програма не зазнає аварії й виведе "Got an exception". Замість завершення роботи Ruby виконує код у блоці rescue, який виводить повідомлення.
Як і все в Ruby, винятки - це також обʼєкти, і зазвичай вони зберігають дані про виняток. Ось як ми можемо отримати обʼєкт винятку:
begin
# ...any code that raises an exception
rescue => e
puts "Exception class: #{ e.class.name }"
puts "Exception Message:#{e.message}"
end
У Ruby також можна викликати власні винятки. Наприклад:
begin
raise ArgumentError.new("Invalid argument")
rescue ArgumentError => e
puts e.message
end
Наведений вище виняток - один із вбудованих винятків Ruby, але ми також можемо визначати власні винятки й викликати їх:
class CustomError < StandardError
end
raise CustomError.new("Something went wrong")
У цій вправі ми займемося обробкою помилок для простого калькулятора.
Мета - мати робочий калькулятор, який повертає рядок тексту (англ. string) за таким зразком: 16 + 51 = 67, якщо передати йому аргументи 16, 51 і +.
SimpleCalculator.calculate(16, 51, "+")
# => "16 + 51 = 67"
SimpleCalculator.calculate(32, 6, "*")
# => "32 * 6 = 192"
SimpleCalculator.calculate(512, 4, "/")
# => "512 / 4 = 128"
calculate
Головним методом, який ми реалізуємо в цьому завданні, буде метод класу SimpleCalculator.calculate().
Він приймає три аргументи.
Перші два аргументи - числа, над якими буде виконуватися операція.
Третій аргумент має тип рядок тексту, і в цій вправі потрібно реалізувати такі операції:
+
*
/
Оновіть метод SimpleCalculator.calculate(), щоб він викликав виняток UnsupportedOperation для невідомих символів операцій.
SimpleCalculator.calculate(1, 2, '-')
# => Raises an UnsupportedOperation
У цій вправі потрібно визначити виняток UnsupportedOperation для конкретної області видимості.
Оновіть метод SimpleCalculator.calculate(), щоб він викликав виняток ArgumentError для неправильних типів аргументів.
SimpleCalculator.calculate(1, '2', '*')
# => Raises an ArgumentError
Оновіть SimpleCalculator.calculate(), щоб він обробляв винятки ZeroDivisionError.
Код обробки має повернути рядок тексту з таким вмістом: Division by zero is not allowed..
Усі інші винятки метод SimpleCalculator.calculate() обробляти не повинен.
SimpleCalculator.calculate(512, 0, "/")
# => returns "Division by zero is not allowed."
Зареєструйтеся на Exercism, щоб вивчати й опановувати Ruby, а також 21 концепція121 вправа та справжнє наставництво від людей, і все це безкоштовно.