Ruby什么时候提出例外?

时间:2017-09-20 00:07:29

标签: ruby-on-rails ruby

如果找不到category,我应该返回false,并在转移完成后返回true。或者我应该提出异常吗?

我还不清楚何时提出异常。

    def transfer(amount, account)
      category = Category.find_by(name: 'Transfer')

      Account.transaction do
        debit = Debit.new(amount: amount, account: self, category: category)                                                                                   
        debit.save                                                                                                                                        

        credit = Credit.new(amount: amount, account: account, category: category)                                                                              
        credit.save                                                                                                                                       
      end                                                                                                                                                 
    end

2 个答案:

答案 0 :(得分:1)

我会对EJ2105提供的反对意见提出反对意见。

在这种特定情况下(我提供的意见比任何合理的建议更多),我会选择提出异常(并且可能会杀死程序并报告严重错误)。

类别"Transfer"在您的应用程序中是硬编码的。无法找到的事实是一个严重错误,可能反映了数据库严重故障,例如缺少迁移或播种错误。

至于处理任何#save错误,我可能会通知用户该交易没有通过。这似乎是一种可能的和预期的(如果不是快乐的)结果。

答案 1 :(得分:0)

这可以通过条件轻松处理:

$("#3rdback").click(function() {  
  if (!animated) {
    $("#3rd").fadeOut(3500, 'swing');
    $("#2nd").delay(3500).fadeIn(4500, 'swing'); 
  }
});

你的意图也很清楚。所以我在这里没有使用异常。

但是,您确实希望引发异常的一个地方是您的事务,因为事务依赖于异常来触发回滚。因此,例如,您不想使用if Category.exists?(name: 'Transfer') ##process category else ##handle error end 。相反,使用#save,这会在失败时引发异常。而且你会想要抓住这些例外,因为它们会冒泡:

#save!

如果这是一个向用户公开的操作,您还需要处理异常,以便向用户显示正确的页面并获取正确的错误消息。