我对以下概念真的很困惑:
- 不要将异常用作控制流
- 不要作为异常返回 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
最佳答案
曾几何时,有一种语言没有异常结构 (c)。每条消息返回一个整数 - 0 表示成功或一些错误代码表示失败。如果调用者在继续之前没有检查返回码——他就完蛋了。此外,大多数时候调用者对失败无能为力,所以即使他确实检查了结果 - 他能做的唯一明智的事情就是返回它自己的错误代码...
然后是c++ ,具有异常构造,仅适用于这些用例。该方法遇到无法处理的情况时会出现异常(exception)情况(例如读取不存在的文件,或在没有互联网连接的情况下上网冲浪)。
滥用 Exception 构造意味着在完全预期的情况下引发异常,例如:
def even?
if (self % 2 != 0)
raise NumberNotEvenException
end
end
在这里,奇数是合法的,也是意料之中的;抛出错误是滥用异常结构。
当方法不能完成它 promise 的事情时抛出异常。
另一方面 - 当方法失败时返回 nil
或 false
让我们回到快乐的 c几天来,调用者的负担是注意到失败并弄清楚出了什么问题——这并不好玩。
关于ruby-on-rails - 返回 false 与在 Ruby 中引发异常 - 何时以及为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23815147/