ruby-on-rails - Ruby 流量控制 : throw an exception, 返回 nil 还是让它失败?

标签 ruby-on-rails ruby control-flow

我在思考流量控制的最佳实践。我应该走哪条路?

1) 不要检查任何东西并让程序失败(更清晰的代码,自然的错误消息):

  def self.fetch(feed_id)
    feed = Feed.find(feed_id)
    feed.fetch
  end

2) 通过返回 nil 静默失败(但是,“Clean Code”说,你永远不应该返回 null):

  def self.fetch(feed_id)
    return unless feed_id
    feed = Feed.find(feed_id)
    return unless feed
    feed.fetch
  end

3) 抛出异常(因为不按 id 查找 feed 是异常的):

  def self.fetch(feed_id)
    raise ArgumentError.new unless feed_id
    feed = Feed.find(feed_id)
    raise ArgumentError.new unless feed
    feed.fetch
  end

换句话说:我应该主动使用保护条件,还是依赖 Ruby/Rails 方法并让它们抛出异常更好,如果出现问题?

最佳答案

1) Don't check anything and let the program fail (cleaner code, natural error messages):

使用已知的、记录在案的异常“让程序失败”是可以的,但是因为您尝试使用 nil 对象而得到令人不快的 NoMethodError 只是粗心大意。在您的特定示例中,ActiveRecord#find 引发了记录在案的 ActiveRecord::RecordNotFound 异常,因此 IMO 这是要走的路:

def self.fetch(feed_id)
  Feed.find(feed_id).fetch
end

2) Fail silently by returning nil (however, "Clean Code" says, that you should never return null):

作为一般建议,这很好,但是 Ruby 充斥着返回 nil 的方法;没关系(同样,只要它被记录),它只是意味着“无”(并允许非常紧凑的模式 something_that_can_be_nil || another_value)。在这种情况下,我会使用 Ick 的 maybe 简洁地编写它:

def self.fetch(feed_id)
  Feed.find_by_id(feed_id).maybe.fetch
end

3) Throw exceptions (because it's exceptional not to find a feed by id):

是的,但随后让该方法引发众所周知的 RecordNotFound 异常,而不是自定义异常(除非您想抽象出您正在使用 AR 的事实,这可能非常麻烦) .

关于ruby-on-rails - Ruby 流量控制 : throw an exception, 返回 nil 还是让它失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10861298/

相关文章:

ruby-on-rails - 将 devise_token_auth 与表单例份验证一起使用

ruby-on-rails - Ruby On Rails 子域约定

ruby-on-rails - 如何从我的 Rails 关联中删除 N+1 查询?

ruby - 使用元编程来包围类中的方法

rust - 可以在表达式中结合赋值和比较吗?

ruby-on-rails - Bootstrap 在 Rails 应用程序中不起作用

mysql - 如何使用 jruby 访问 mysql 表?

javascript - Javascript 中的 break 关键字是否仅用于跳出循环?

c# - IEnumerable foreach,对最后一个元素做一些不同的事情

ruby-on-rails - Ruby on Rails/Postgres - 如何为不存在的用户创建新数据库?