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中编码时需要考虑的问题。