【发布时间】:2010-04-09 14:40:31
【问题描述】:
我想知道人们是否会分享他们处理异常和错误的最佳实践/策略。现在我不是在问什么时候抛出异常(这里已经彻底回答了:SO: When to throw an Exception)。而且我没有在我的应用程序流程中使用它——但总是有合法的例外情况发生。例如,最流行的是 ActiveRecord::RecordNotFound。处理它的最佳方法是什么? DRY 方式?
现在我正在我的控制器中进行大量检查,所以如果Post.find(5) 返回 Nil - 我会检查并抛出一个 flash 消息。然而,虽然这非常精细 - 从某种意义上说,我需要在每个控制器中检查类似的异常,但它们中的大多数本质上是相同的,并且与未找到记录或未找到相关记录有关 - 例如因为Post.find(5) 未找到,或者如果您尝试显示与不存在的帖子相关的 cmets,则会引发异常(类似于Post.find(5).comments[0].created_at)
我知道您可以在 ApplicationController 中执行类似的操作,并稍后在特定控制器/方法中覆盖它以获得更精细的支持,但是这样做是否合适?
class ApplicationController < ActionController::Base
rescue_from ActiveRecord::RecordInvalid do |exception|
render :action => (exception.record.new_record? ? :new : :edit)
end
end
如果找不到Post.find(5),这也可以工作,但Post.find(5).comments[0].created_at 呢?我的意思是,如果帖子存在但没有cmets,我不能抛出一个完整的异常,对吧?
总结到目前为止,我使用 if/else/unless 或 case/when 进行了大量手动检查(我承认偶尔开始/救援)并检查 nil?还是空的?等,但似乎必须有更好的方法。
回复:
@米兰: 嗨米兰 感谢您的回复-我同意您所说的,并且我认为我误用了例外一词。我的意思是,我现在做了很多事情,比如:
if Post.exists?(params[:post_id])
@p = Post.find(params[:post_id])
else
flash[:error] = " Can't find Blog Post"
end
我做了很多这种“异常处理”,我尽量避免使用开始/救援。但在我看来,这是一个足够普遍的结果/验证/情况,应该有一种 DRYer 方法来做到这一点,不是吗? 你会怎么做这样的检查?
在这种情况下如何处理呢? 假设您想在视图中显示评论创建日期:
Last comment for this post at : <%= @post.comments[0].created_at %>
而且这篇文章没有任何 cmets。 你可以这样做
Last comment for this post at : <%= @post.comments.last.created_at unless @post.comments.empty? %>
您可以检查控制器。等等。有几种方法可以做到这一点。但是处理这个问题的“最佳”方法是什么?
【问题讨论】:
标签: ruby-on-rails exception exception-handling