Rails - Rubocop - 开始 + 救援语法

Mar*_*ark 9 ruby ruby-on-rails rubocop

我有以下代码:

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

通过对一些博客的简要阅读,我应该像上面一样使用开始救援和结束来处理错误,但是我收到了一个多余的“开始”rubocop 警告。

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

提前致谢

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

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

?

Urs*_*sus 7

当开始是方法中的第一件事时执行此操作

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

  • ...匹配的`end` 将是最后一个:D (3认同)

Jör*_*tag 5

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

def foo
  begin
  rescue
  end
end
Run Code Online (Sandbox Code Playgroud)

或者

foo do
  begin
  rescue
  end
end
Run Code Online (Sandbox Code Playgroud)

或者

-> do
  begin
  rescue
  end
end
Run Code Online (Sandbox Code Playgroud)

你可以用只替换它

def foo
rescue
end
Run Code Online (Sandbox Code Playgroud)

或块和 lambda 的等价物。