Exceptions and Safety
Begin Rescue
begin and rescue let a program handle an error path and keep running.
rescue
A `rescue` block runs when code inside `begin` raises an exception.
Begin Rescue
begin_rescue.rb
Replay: real traced execution (multi-file project)
raw_count = "4"
begin
count = Integer(raw_count)
result = 12 / count
puts "count=#{count}"
puts "result=#{result}"
rescue ArgumentError
puts "count=invalid"
rescue ZeroDivisionError
puts "count=zero"
end
puts "done"
raw_count = "0"
begin
count = Integer(raw_count)
result = 12 / count
puts "count=#{count}"
puts "result=#{result}"
rescue ArgumentError
puts "count=invalid"
rescue ZeroDivisionError
puts "count=zero"
end
puts "done"
raw_count = "oops"
begin
count = Integer(raw_count)
result = 12 / count
puts "count=#{count}"
puts "result=#{result}"
rescue ArgumentError
puts "count=invalid"
rescue ZeroDivisionError
puts "count=zero"
end
puts "done"
raw_count ← 4, count ← 4, result ← 3
1raw_count→ 4 = "4" #@raw_count="0", "oops"23begin4 count→ 4 = Integer(raw_count4)5 result→ 3 = 12 / count46 puts "count=#{count4}"7 puts "result=#{result3}"8rescue ArgumentError9 puts "count=invalid"10rescue ZeroDivisionError11 puts "count=zero"12end1314puts "done"outputcount=4 result=3 done
raw_count ← 0, count ← 0
1raw_count→ 0 = "0"23begin4 count→ 0 = Integer(raw_count0)5 result = 12 / count06 puts "count=#{count}"7 puts "result=#{result}"8rescue ArgumentError9 puts "count=invalid"10rescue ZeroDivisionError11 puts "count=zero"12end1314puts "done"outputcount=zero done
raw_count ← oops
1raw_count→ oops = "oops"23begin4 count = Integer(raw_countoops)5 result = 12 / count6 puts "count=#{count}"7 puts "result=#{result}"8rescue ArgumentError9 puts "count=invalid"10rescue ZeroDivisionError11 puts "count=zero"12end1314puts "done"outputcount=invalid done