Exceptions
Don’t use exceptions for flow of control.
[link]# bad
begin
n / d
rescue ZeroDivisionError
puts "Cannot divide by 0!"
end
# good
if d.zero?
puts "Cannot divide by 0!"
else
n / d
end
Avoid rescuing the
Exception
class.
[link]# bad
begin
# an exception occurs here
rescue Exception
# exception handling
end
# good
begin
# an exception occurs here
rescue StandardError
# exception handling
end
# acceptable
begin
# an exception occurs here
rescue
# exception handling
end
Don’t specify
RuntimeError
explicitly in
the two argument version of raise. Prefer error sub-classes for clarity and
explicit error creation.[link]# bad
raise RuntimeError, 'message'
# better - RuntimeError is implicit here
raise 'message'
# best
class MyExplicitError < RuntimeError; end
raise MyExplicitError
Prefer supplying an exception class and a message as two separate arguments
toraise
, instead of an exception instance.
[link]# bad
raise SomeException.new('message')
# Note that there is no way to do `raise SomeException.new('message'), backtrace`.
# good
raise SomeException, 'message'
# Consistent with `raise SomeException, 'message', backtrace`.
Avoid using rescue in its modifier form.
[link]# bad
read_file rescue handle_error($!)
# good
begin
read_file
rescue Errno:ENOENT => ex
handle_error(ex)
end