class Ameba::Rule::Lint::TrailingRescueException

Overview

A rule that prohibits the common misconception about how trailing rescue statements work, preventing Paths (exception class names or otherwise) from being used as the trailing value. The value after the trailing rescue statement is the value to use if an exception occurs, not the exception for the rescue to capture.

For example, this is considered invalid - if an exception occurs in method.call, value will be assigned the value of MyException:

value = method.call("param") rescue MyException

And should instead be written as this in order to capture only MyException exceptions:

value = begin
  method.call("param")
rescue MyException
  "default value"
end

Or to rescue all exceptions (instead of just MyException):

value = method.call("param") rescue "default value"

YAML configuration example:

Lint/TrailingRescueException:
  Enabled: true

Included Modules

Defined in:

ameba/rule/lint/trailing_rescue_exception.cr

Constant Summary

MSG = "Trailing rescues with a path aren't allowed, use a block rescue instead to filter by exception type"

Constructors

Class Method Summary

Instance Method Summary

Instance methods inherited from class Ameba::Rule::Base

==(other) ==, catch(source : Source) catch, excluded?(source) excluded?, group group, hash hash, name name, special? special?, test(source : Source, node : Crystal::ASTNode, *opts)
test(source : Source)
test

Class methods inherited from class Ameba::Rule::Base

default_severity : Ameba::Severity default_severity

Macros inherited from class Ameba::Rule::Base

issue_for(*args, **kwargs, &block) issue_for

Macros inherited from module Ameba::Config::RuleConfig

properties(&block) properties

Constructor Detail

def self.new(ctx : YAML::ParseContext, node : YAML::Nodes::Node) #

def self.new(config = nil) #

A rule that prohibits the common misconception about how trailing rescue statements work, preventing Paths (exception class names or otherwise) from being used as the trailing value. The value after the trailing rescue statement is the value to use if an exception occurs, not the exception for the rescue to capture.

For example, this is considered invalid - if an exception occurs in method.call, value will be assigned the value of MyException:

value = method.call("param") rescue MyException

And should instead be written as this in order to capture only MyException exceptions:

value = begin
  method.call("param")
rescue MyException
  "default value"
end

Or to rescue all exceptions (instead of just MyException):

value = method.call("param") rescue "default value"

YAML configuration example:

Lint/TrailingRescueException:
  Enabled: true

[View source]

Class Method Detail

def self.parsed_doc : String | Nil #

Returns documentation for this rule, if there is any.

module Ameba
  # This is a test rule.
  # Does nothing.
  class MyRule < Ameba::Rule::Base
    def test(source)
    end
  end
end

MyRule.parsed_doc # => "This is a test rule.\nDoes nothing."

Instance Method Detail

def description : String #

def description=(description : String) #

def enabled=(enabled : Bool) #

def enabled? : Bool #

def excluded : Array(String) | Nil #

def excluded=(excluded : Array(String) | Nil) #

def severity : Ameba::Severity #

def severity=(severity : Ameba::Severity) #

def since_version : SemanticVersion | Nil #

[View source]
def since_version=(since_version : String) #

def test(source, node : Crystal::ExceptionHandler) #

[View source]