Class: RuboCop::Cop::Lint::RaiseException

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Defined in:
lib/rubocop/cop/lint/raise_exception.rb

Overview

Checks for raise or fail statements which raise Exception or Exception.new. Use StandardError or a specific exception class instead.

If you have defined your own namespaced Exception class, it is possible to configure the cop to allow it by setting AllowedImplicitNamespaces to an array with the names of the namespaces to allow. By default, this is set to ‘[’Gem’]‘, which allows Gem::Exception to be raised without an explicit namespace. If not allowed, a false positive may be registered if `raise Exception` is called within the namespace.

Alternatively, use a fully qualified name with raise/fail (eg. ‘raise Namespace::Exception`).

Examples:

# bad
raise Exception, 'Error message here'
raise Exception.new('Error message here')

# good
raise StandardError, 'Error message here'
raise MyError.new, 'Error message here'

AllowedImplicitNamespaces: [‘Gem’] (default)

# bad - `Foo` is not an allowed implicit namespace
module Foo
  def self.foo
    raise Exception # This is qualified to `Foo::Exception`.
  end
end

# good
module Gem
  def self.foo
    raise Exception # This is qualified to `Gem::Exception`.
  end
end

# good
module Foo
  def self.foo
    raise Foo::Exception
  end
end

Constant Summary collapse

MSG =
'Use `StandardError` over `Exception`.'
RESTRICT_ON_SEND =
i[raise fail].freeze

Instance Attribute Summary

Attributes inherited from Base

#config, #processed_source

Instance Method Summary collapse

Methods included from AutoCorrector

support_autocorrect?

Methods inherited from Base

#active_support_extensions_enabled?, #add_global_offense, #add_offense, #always_autocorrect?, autocorrect_incompatible_with, badge, #begin_investigation, #callbacks_needed, callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #contextual_autocorrect?, #cop_config, #cop_name, cop_name, department, documentation_url, exclude_from_registry, #excluded_file?, #external_dependency_checksum, inherited, #initialize, #inspect, joining_forces, lint?, match?, #message, #offenses, #on_investigation_end, #on_new_investigation, #on_other_file, #parse, #parser_engine, #ready, #relevant_file?, requires_gem, #string_literals_frozen_by_default?, support_autocorrect?, support_multiple_source?, #target_gem_version, #target_rails_version, #target_ruby_version

Methods included from ExcludeLimit

#exclude_limit

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #autocorrect_with_disable_uncorrectable?, #correctable?, #disable_uncorrectable?, #safe_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

silence_warnings

Constructor Details

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

Instance Method Details

#exception?(node) ⇒ Object



60
61
62
# File 'lib/rubocop/cop/lint/raise_exception.rb', line 60

def_node_matcher :exception?, "(send nil? {:raise :fail} $(const ${cbase nil?} :Exception) ... )\n"

#exception_new_with_message?(node) ⇒ Object



65
66
67
68
# File 'lib/rubocop/cop/lint/raise_exception.rb', line 65

def_node_matcher :exception_new_with_message?, "(send nil? {:raise :fail}\n  (send $(const ${cbase nil?} :Exception) :new ... ))\n"

#on_send(node) ⇒ Object



70
71
72
# File 'lib/rubocop/cop/lint/raise_exception.rb', line 70

def on_send(node)
  exception?(node, &check(node)) || exception_new_with_message?(node, &check(node))
end