【问题标题】:Rails - Rubocop - Begin + Rescue syntaxRails - Rubocop - Begin + Rescue 语法
【发布时间】:2019-06-06 04:59:15
【问题描述】:

我有以下代码:

  def payload
    begin
      @payload ||= Warden::JWTAuth::TokenDecoder.new.call(token)
    rescue JWT::ExpiredSignature => e
      Rollbar.warning(e)
    end
  end

通过简要阅读一些博客,我应该使用 begin rescue 和 end 来处理我上面所做的错误,但是我收到了一个多余的“开始”rubocop 警告。

是否仅在指定可能导致较大块内错误的代码位时才使用 begin?因此这里是多余的吗?

提前致谢

编辑:如果我不需要它,是否写成

  def payload
    @payload ||= Warden::JWTAuth::TokenDecoder.new.call(token)
  rescue JWT::ExpiredSignature => e
    Rollbar.warning(e)
  end

?

【问题讨论】:

  • begin ... end 也可以用于非rescue 的原因——其中最值得注意的可能是begin ... end while test。 (或until),它保证在检查test 之前通过循环。

标签: ruby-on-rails ruby rubocop


【解决方案1】:

当开始是你方法中的第一件事时这样做

def payload
  @payload ||= Warden::JWTAuth::TokenDecoder.new.call(token)
rescue JWT::ExpiredSignature => e
  Rollbar.warning(e)
end

【讨论】:

  • ...匹配的end 将是最后一个:D
【解决方案2】:

方法体、块体和 lambda 体是隐式异常块。您不需要将方法体、块体或 lambda 体的整个代码包装在 begin / rescue / else / ensure / end 异常中块,因为它已经隐含地为一。所以,每当你有类似的东西

def foo
  begin
  rescue
  end
end

或

foo do
  begin
  rescue
  end
end

或

-> do
  begin
  rescue
  end
end

你可以只替换它

def foo
rescue
end

或块和 lambda 的等价物。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-01
    • 2011-03-22
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2018-07-03
    • 1970-01-01
    相关资源
    最近更新 更多