我想知道是否有人会分享他们的最佳做法/策略处理异常&错误。现在我不问什么时候抛出异常(这里已经得到了严格的回答:SO: When to throw an Exception)。而且我没有将它用于我的应用程序流 - 但是有合法的例外情况一直发生。例如,最流行的将是ActiveRecord :: RecordNotFound。什么是处理它的最好方法?干的方式?在Rails中处理异常和错误的最佳策略是什么?
现在我正在我的控制器内进行很多检查,所以如果Post.find(5)
返回无 - 我检查并发出一条消息。然而,尽管这非常精细 - 但从某种意义上说,我需要检查每个控制器中的异常,但它们中的大多数基本上都是相同的,并且与未找到的记录未找到或相关记录有关,因此有点麻烦 - 例如因为Post.find(5)
找不到,或者如果你想显示与不存在的帖子有关的评论,这将抛出一个异常(类似于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
- 我的意思是,如果后存在,但还没有评论,对我不能把一个完全成熟的异常?
总结到目前为止,我做了大量的手动检查,使用if/else /除非或case/when(和我承认偶尔开始/救援)并检查nil?或空?等,但似乎有一个更好的方式。
回复:
@Milan: 喜米兰 感谢您的答复 - 我同意你说的话,我想我滥用这个词例外。我的意思是,现在我做了很多的东西,如:
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 %>
和这个职位不会有任何意见。 你可以做
Last comment for this post at : <%= @post.comments.last.created_at unless @post.comments.empty? %>
你可以做一个检查控制器。等等。有几种方法可以做到这一点。但是,处理这个问题的“最佳”方法是什么?
请 - 见上面的回答我的答复 - 我不能评论后进行适当的缩进代码:-) – konung 2010-04-09 21:52:53
嘿尼克,对不起,听起来如此ranty。我只是没有足够的时间为我的答案添加任何建设性的部分。现在,它在那里。希望整个答案现在更有帮助。 – 2010-04-09 23:04:26
没问题 - 没有冒犯,我的问题也不是很清楚 - 直到我清理它。你给了我几个好的指针 - 我只是稍微等一下,也许有人有更多的建议,然后我会将其标记为已回答。谢谢你的详细解答。 :-) – konung 2010-04-09 23:19:24