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-“重要的是错误被捕获并得到正确处理”,我完全同意。我相信异常抛出的问题正是如此。异常是处理错误的“正确”方法吗?我并没有真正考虑使用错误代码或错误响应来代替异常。但是,当应用程序的合理预期被忽略时(即,缺少方法、缺少数据库表、缺少核心数据结构),异常可能是处理错误的合适方法。