ruby-on-rails - 返回 false 与在 Ruby 中引发异常 - 何时以及为什么?

标签 ruby-on-rails ruby exception-handling

我对以下概念真的很困惑:

  • 不要将异常用作控制流
  • 不要作为异常返回 nil/false

假设我有以下实例方法:

class Logo
  # This method has some logic to create an image using Rmagick
  def process
    begin
      @logo_image = RmagickHelper.new(self.src)
    rescue Magick::ImageMagickError
      raise Exceptions::LogoUnprocessable, "ImageMagick can't process the URL"
    end
  end
end

所以在更通用的方法中,我有以下内容:

def build_all_images
    begin
      @logo.process
    rescue Exceptions::LogoUnprocessable
      @logo.status = 'unprocessable'
      return false #This terminates the method so no more stuff is processed, because logo could not be processed.
    end
#....
end

我的问题是:

这样做是否正确:

raise Exceptions::LogoUnprocessable, "ImageMagick can't process the URL"

或者我应该刚刚完成

return false

最佳答案

曾几何时,有一种语言没有异常结构 ()。每条消息返回一个整数 - 0 表示成功或一些错误代码表示失败。如果调用者在继续之前没有检查返回码——他就完蛋了。此外,大多数时候调用者对失败无能为力,所以即使他确实检查了结果 - 他做的唯一明智的事情就是返回它自己的错误代码...

然后是 ,具有异常构造,仅适用于这些用例。该方法遇到无法处理的情况时会出现异常(exception)情况(例如读取不存在的文件,或在没有互联网连接的情况下上网冲浪)。

滥用 Exception 构造意味着在完全预期的情况下引发异常,例如:

def even?
  if (self % 2 != 0)
    raise NumberNotEvenException
  end
end

在这里,奇数是合法的,也是意料之中的;抛出错误是滥用异常结构。

当方法不能完成它 promise 的事情时抛出异常。

另一方面 - 当方法失败时返回 nilfalse 让我们回到快乐的 几天来,调用者的负担是注意到失败并弄清楚出了什么问题——这并不好玩。

关于ruby-on-rails - 返回 false 与在 Ruby 中引发异常 - 何时以及为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23815147/

相关文章:

javascript - 仅隐藏数据表的这一部分(从 x 个总条目中过滤)

javascript - 使用 Gmaps4rails v2 在 map 加载后添加和更新标记

ruby-on-rails - Rails 中的 ActiveModel::Serializer - JSON 结果中忽略的序列化程序方法

ruby - 为什么是替换而不是替换!对于 ruby 中的字符串?

ruby-on-rails - Rails 3.2.3 命名空间 Controller 被具有相同名称的全局 Controller 覆盖

ruby-on-rails - PG :ConnectBad Rails 4 Postgresql

ios - Ruby:LoadError - 找不到类 Digest::SHA1 的库——摘要/sha1

c# - 在异常处理中显示行号

python - 向 sys.excepthook 添加函数

.net - 异常处理