class RuboCop::Cop::Lint::InheritException

C = Class.new(RuntimeError)
class C < RuntimeError; end
# good
C = Class.new(Exception)
class C < Exception; end
# bad
@example EnforcedStyle: runtime_error
C = Class.new(StandardError)
class C < StandardError; end
# good
C = Class.new(Exception)
class C < Exception; end
# bad
@example EnforcedStyle: standard_error (default)
but not ‘Exception` and its subclasses.
exception class handle `StandardError` and its subclasses,
This cop’s autocorrection is unsafe because ‘rescue` that omit
@safety
`RuntimeError` instead.
It is configurable to suggest using either `StandardError` (default) or
Looks for error classes inheriting from `Exception`.

def exception_class?(class_node)

def exception_class?(class_node)
  class_node.const_name == 'Exception'
end

def message(node)

def message(node)
  format(MSG, prefer: preferred_base_class, current: node.const_name)
end

def on_class(node)

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

def on_send(node)

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

def preferred_base_class

def preferred_base_class
  PREFERRED_BASE_CLASS[style]
end