Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 返回false与在Ruby中引发异常-何时以及为什么?_Ruby On Rails_Ruby_Exception Handling_C_C++ - Fatal编程技术网

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

Ruby on rails 返回false与在Ruby中引发异常-何时以及为什么?,ruby-on-rails,ruby,exception-handling,c,c++,Ruby On Rails,Ruby,Exception Handling,C,C++,我对以下概念感到困惑: 不要将异常用作控制流 不要将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

我对以下概念感到困惑:

  • 不要将异常用作控制流
  • 不要将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表示成功,或返回一些错误代码表示失败。如果打电话的人在继续之前没有检查返回码,他就完蛋了。而且,大多数情况下,调用方对故障无能为力,因此即使他检查了结果,他唯一能做的明智的事情就是返回自己的错误代码

然后出现了异常构造,只针对这些用例。当方法遇到无法处理的情况时(如读取不存在的文件,或在没有internet连接的情况下浏览web),会出现例外情况

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

def even?
  if (self % 2 != 0)
    raise NumberNotEvenException
  end
end
在这里,一个奇数是合法的,也是意料之中的;抛出错误是误用异常构造

当方法无法实现其承诺的操作时引发异常


另一方面,当一个方法失败时,返回
nil
false
会让我们回到快乐的日子,在快乐的日子里,调用者有责任注意到失败,并找出哪里出了错——这不是乐趣。

不同之处在于失败发生的频率以及它是否是一个简单的返回值

询问“这是一个有效的url”将期望一个“false”值,但在这种情况下,似乎当期望一个有效的url时,失败案例将保证一个例外

例外是“例外”或不寻常。异常发生在命令方法中,在命令方法中,您告诉它“执行此操作”,它说“oops!”

流控制更多的是一个“这是什么”的问题,在这种情况下,“oops”没有意义


也要考虑代码被调用的次数——异常要比简单的返回值要花更多的时间。

我强烈推荐这样,在我的例子中,我会引发异常,因为那个图像的SRC是不可访问的(因为网页是下降的,或者因为它不能作为图像打开)。这将是一个引发异常的好例子,对吗?是的,在这种情况下,异常似乎是可行的。可能没有直接关系,但Rails中的
save
返回
false
save
抛出一个错误,所以这可能是在Rails中编码时需要考虑的问题。