class RuboCop::Cop::Lint::RescueType

Check for arguments to `rescue` that will result in a `TypeError` if an exception is raised.

@example

# bad
begin
  bar
rescue nil
  baz
end

# bad
def foo
  bar
rescue 1, 'a', "#{b}", 0.0, [], {}
  baz
end

# good
begin
  bar
rescue
  baz
end

# good
def foo
  bar
rescue NameError
  baz
end

Constants

INVALID_TYPES
MSG

Public Instance Methods

autocorrect(corrector, node) click to toggle source
# File lib/rubocop/cop/lint/rescue_type.rb, line 60
def autocorrect(corrector, node)
  rescued, _, _body = *node
  range = Parser::Source::Range.new(node.loc.expression.source_buffer,
                                    node.loc.keyword.end_pos,
                                    rescued.loc.expression.end_pos)

  corrector.replace(range, correction(*rescued))
end
on_resbody(node) click to toggle source
# File lib/rubocop/cop/lint/rescue_type.rb, line 44
def on_resbody(node)
  rescued, _, _body = *node
  return if rescued.nil?

  exceptions = *rescued
  invalid_exceptions = invalid_exceptions(exceptions)
  return if invalid_exceptions.empty?

  add_offense(
    node.loc.keyword.join(rescued.loc.expression),
    message: format(MSG, invalid_exceptions: invalid_exceptions.map(&:source).join(', '))
  ) do |corrector|
    autocorrect(corrector, node)
  end
end

Private Instance Methods

correction(*exceptions) click to toggle source
# File lib/rubocop/cop/lint/rescue_type.rb, line 71
def correction(*exceptions)
  correction = valid_exceptions(exceptions).map(&:source).join(', ')
  correction = " #{correction}" unless correction.empty?

  correction
end
invalid_exceptions(exceptions) click to toggle source
# File lib/rubocop/cop/lint/rescue_type.rb, line 82
def invalid_exceptions(exceptions)
  exceptions.select { |exception| INVALID_TYPES.include?(exception.type) }
end
valid_exceptions(exceptions) click to toggle source
# File lib/rubocop/cop/lint/rescue_type.rb, line 78
def valid_exceptions(exceptions)
  exceptions - invalid_exceptions(exceptions)
end