class RuboCop::Cop::Lint::InheritException

Looks for error classes inheriting from ‘Exception`. It is configurable to suggest using either `StandardError` (default) or `RuntimeError` instead.

@safety

This cop's autocorrection is unsafe because `rescue` that omit
exception class handle `StandardError` and its subclasses,
but not `Exception` and its subclasses.

@example EnforcedStyle: standard_error (default)

# bad

class C < Exception; end

C = Class.new(Exception)

# good

class C < StandardError; end

C = Class.new(StandardError)

@example EnforcedStyle: runtime_error

# bad

class C < Exception; end

C = Class.new(Exception)

# good

class C < RuntimeError; end

C = Class.new(RuntimeError)

Constants

MSG
PREFERRED_BASE_CLASS
RESTRICT_ON_SEND

Public Instance Methods

on_class(node) click to toggle source
# File lib/rubocop/cop/lint/inherit_exception.rb, line 59
def on_class(node)
  return unless node.parent_class && exception_class?(node.parent_class)

  message = message(node.parent_class)

  add_offense(node.parent_class, message: message) do |corrector|
    corrector.replace(node.parent_class, preferred_base_class)
  end
end
on_send(node) click to toggle source
# File lib/rubocop/cop/lint/inherit_exception.rb, line 69
def on_send(node)
  constant = class_new_call?(node)
  return unless constant && exception_class?(constant)

  message = message(constant)

  add_offense(constant, message: message) do |corrector|
    corrector.replace(constant, preferred_base_class)
  end
end

Private Instance Methods

exception_class?(class_node) click to toggle source
# File lib/rubocop/cop/lint/inherit_exception.rb, line 86
def exception_class?(class_node)
  class_node.const_name == 'Exception'
end
message(node) click to toggle source
# File lib/rubocop/cop/lint/inherit_exception.rb, line 82
def message(node)
  format(MSG, prefer: preferred_base_class, current: node.const_name)
end
preferred_base_class() click to toggle source
# File lib/rubocop/cop/lint/inherit_exception.rb, line 90
def preferred_base_class
  PREFERRED_BASE_CLASS[style]
end