class RuboCop::Cop::Lint::RescueType
end
baz
rescue NameError
bar
def foo
# good
end
baz
rescue
bar
begin
# good
end
baz
rescue 1, ‘a’, “#{b}”, 0.0, [], {}
bar
def foo
# bad
end
baz
rescue nil
bar
begin
# bad
@example
if an exception is raised.
Check for arguments to ‘rescue` that will result in a `TypeError`
def autocorrect(node)
def autocorrect(node) rescued, _, _body = *node range = Parser::Source::Range.new(node.loc.expression.source_buffer, node.loc.keyword.end_pos, rescued.loc.expression.end_pos) lambda do |corrector| corrector.replace(range, correction(*rescued)) end end
def correction(*exceptions)
def correction(*exceptions) correction = valid_exceptions(exceptions).map(&:source).join(', ') correction = " #{correction}" unless correction.empty? correction end
def invalid_exceptions(exceptions)
def invalid_exceptions(exceptions) exceptions.select do |exception| INVALID_TYPES.include?(exception.type) end end
def on_resbody(node)
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, location: node.loc.keyword.join(rescued.loc.expression), message: format( MSG, invalid_exceptions: invalid_exceptions.map(&:source) .join(', ') ) ) end
def valid_exceptions(exceptions)
def valid_exceptions(exceptions) exceptions - invalid_exceptions(exceptions) end