Introduction
Sometimes, different errors need different ways to fix them. Multiple rescue clauses let you handle each error separately.
begin # code that might cause errors rescue ErrorType1 # handle ErrorType1 rescue ErrorType2 # handle ErrorType2 else # runs if no error ensure # always runs end
begin 1 / 0 rescue ZeroDivisionError puts "Can't divide by zero!" rescue StandardError puts "Some other error happened." end
begin file = File.open('missing.txt') rescue Errno::ENOENT puts "File not found!" rescue IOError puts "IO error happened!" end
begin puts "Enter a number:" num = Integer(gets.chomp) result = 10 / num puts "10 divided by your number is #{result}" rescue ZeroDivisionError puts "Oops! You can't divide by zero." rescue ArgumentError puts "That's not a valid number." end
rescue clauses in Ruby?begin and rescue for error handling, not try or catch.rescue clauses are written one after another inside begin...end.begin 1 / 0 rescue ZeroDivisionError puts 'Zero division error caught' rescue StandardError puts 'Standard error caught' end
1 / 0 raises a ZeroDivisionError.ZeroDivisionError and prints the message.begin puts 'Start' rescue puts 'Rescue block' rescue ZeroDivisionError puts 'Zero division error' end
def test
begin
raise ArgumentError, 'Wrong argument'
rescue ZeroDivisionError
puts 'Zero division error'
rescue ArgumentError
puts 'Argument error caught'
ensure
puts 'Always runs'
end
end
testArgumentError with message 'Wrong argument'.ArgumentError rescue clause runs and prints 'Argument error caught'.ensure block always runs, printing 'Always runs'.Pass the test and this pattern moves unknown