Class: RuboCop::Cop::Style::RescueStandardError

Inherits:
Cop
  • Object
show all
Includes:
ConfigurableEnforcedStyle, RangeHelp, RescueNode
Defined in:
lib/rubocop/cop/style/rescue_standard_error.rb

Overview

This cop checks for rescuing StandardError. There are two supported styles implicit and explicit. This cop will not register an offense if any error other than StandardError is specified.

Examples:

EnforcedStyle: implicit

# `implicit` will enforce using `rescue` instead of
# `rescue StandardError`.

# bad
begin
  foo
rescue StandardError
  bar
end

# good
begin
  foo
rescue
  bar
end

# good
begin
  foo
rescue OtherError
  bar
end

# good
begin
  foo
rescue StandardError, SecurityError
  bar
end

EnforcedStyle: explicit (default)

# `explicit` will enforce using `rescue StandardError`
# instead of `rescue`.

# bad
begin
  foo
rescue
  bar
end

# good
begin
  foo
rescue StandardError
  bar
end

# good
begin
  foo
rescue OtherError
  bar
end

# good
begin
  foo
rescue StandardError, SecurityError
  bar
end

Constant Summary collapse

MSG_IMPLICIT =
'Omit the error class when rescuing ' \
'`StandardError` by itself.'.freeze
MSG_EXPLICIT =
'Avoid rescuing without specifying ' \
'an error class.'.freeze

Constants included from Util

Util::ASGN_NODES, Util::CONDITIONAL_NODES, Util::EQUALS_ASGN_NODES, Util::LITERAL_REGEX, Util::LOGICAL_OPERATOR_NODES, Util::MODIFIER_NODES, Util::OPERATOR_METHODS, Util::SHORTHAND_ASGN_NODES

Instance Attribute Summary

Attributes inherited from Cop

#config, #corrections, #offenses, #processed_source

Instance Method Summary collapse

Methods included from ConfigurableEnforcedStyle

#alternative_style, #alternative_styles, #ambiguous_style_detected, #correct_style_detected, #detected_style, #detected_style=, #no_acceptable_style!, #no_acceptable_style?, #opposite_style_detected, #style, #style_detected, #style_parameter_name, #supported_styles, #unexpected_style_detected

Methods included from RescueNode

#investigate

Methods inherited from Cop

#add_offense, all, autocorrect_incompatible_with, badge, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, cop_name, #cop_name, #correct, department, #duplicate_location?, #excluded_file?, #find_location, #highlights, inherited, #initialize, #join_force?, lint?, match?, #message, #messages, non_rails, #parse, qualified_cop_name, #relevant_file?, #target_rails_version, #target_ruby_version

Methods included from AST::Sexp

#s

Methods included from NodePattern::Macros

#def_node_matcher, #def_node_search, #node_search, #node_search_all, #node_search_body, #node_search_first

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #support_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

begins_its_line?, comment_line?, double_quotes_required?, escape_string, first_part_of_call_chain, interpret_string_escapes, line_range, needs_escaping?, on_node, operator?, parentheses?, same_line?, to_string_literal, to_supported_styles, tokens

Methods included from PathUtil

absolute?, match_path?, pwd, relative_path, reset_pwd, smart_path

Constructor Details

This class inherits a constructor from RuboCop::Cop::Cop

Instance Method Details

#autocorrect(node) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/rubocop/cop/style/rescue_standard_error.rb', line 107

def autocorrect(node)
  lambda do |corrector|
    case style
    when :implicit
      error = rescue_standard_error?(node)
      range = range_between(node.loc.keyword.end_pos,
                            error.loc.expression.end_pos)
      corrector.remove(range)
    when :explicit
      corrector.insert_after(node.loc.keyword, ' StandardError')
    end
  end
end

#on_resbody(node) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/rubocop/cop/style/rescue_standard_error.rb', line 91

def on_resbody(node)
  return if rescue_modifier?(node)
  case style
  when :implicit
    rescue_standard_error?(node) do |error|
      add_offense(node,
                  location: node.loc.keyword.join(error.loc.expression),
                  message: MSG_IMPLICIT)
    end
  when :explicit
    rescue_without_error_class?(node) do
      add_offense(node, location: :keyword, message: MSG_EXPLICIT)
    end
  end
end