gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:12:15 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com