Ruby on rails Ruby何时引发异常?

Ruby on rails Ruby何时引发异常?,ruby-on-rails,ruby,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
,我是否应该在传输完成时返回
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

这是一个可以用条件语句轻松处理的问题:

if Category.exists?(name: 'Transfer')
  ##process category
else
  ##handle error
end
你的意图在这里也很清楚。所以我在这里不使用exception

但您确实希望在事务内部引发异常,因为事务依赖异常触发回滚。例如,您不想使用
#save
。相反,请使用
#save,失败时引发异常。您将希望捕获这些异常,因为它们会冒泡:

begin
  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 
rescue StandardError, ActiveRecord::RecordInvalid, ActiveRecord::RecordNotSaved => e
  ##send error to my email
end

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

我将对EJ2105提供的操作提出相反的意见

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

类别
“传输”
在应用程序中是硬编码的。找不到它这一事实是一个严重错误,可能反映了数据库关键故障,例如缺少迁移或种子设定错误


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

你应该做任何对你的应用程序最方便的事情,这并不是只有一个答案。如果我必须使用这样一个固定的类别,那么我只需创建该类别,如果它在运行时不存在于具有
category=category.where的特定系统上(名称:'Transfer')。首先\u或\u create
我认为选择不应该取决于错误的严重程度,而应该取决于哪个最适合这个目的。在这种情况下,两种方式可能没有太大区别。重要的是错误被捕获并得到正确处理。@EJ2015-“重要的是错误被捕获并得到正确处理”,我完全同意。我相信异常抛出的问题正是如此。异常是处理错误的“正确”方法吗?我并没有真正考虑使用错误代码或错误响应来代替异常。但是,当应用程序的合理预期被忽略时(即,缺少方法、缺少数据库表、缺少核心数据结构),异常可能是处理错误的合适方法。