class Ameba::Rule::Lint::TrailingRescueException

Overview

A rule that prohibits the 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 class to rescue from.

For example, this is considered invalid - if an exception occurs, response will be assigned with the value of IO::Error instead of nil:

response = HTTP::Client.get("http://www.example.com") rescue IO::Error

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

response = begin
  HTTP::Client.get("http://www.example.com")
rescue IO::Error
  "default value"
end

Or to rescue all exceptions (instead of just IO::Error):

response = HTTP::Client.get("http://www.example.com") rescue "default value"

YAML configuration example:

Lint/TrailingRescueException:
  Enabled: true

Included Modules

Defined in:

ameba/rule/lint/trailing_rescue_exception.cr

Constant Summary

MSG = "Use a block variant of `rescue` to filter by the 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 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 class to rescue from.

For example, this is considered invalid - if an exception occurs, response will be assigned with the value of IO::Error instead of nil:

response = HTTP::Client.get("http://www.example.com") rescue IO::Error

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

response = begin
  HTTP::Client.get("http://www.example.com")
rescue IO::Error
  "default value"
end

Or to rescue all exceptions (instead of just IO::Error):

response = HTTP::Client.get("http://www.example.com") 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]