最近在写 rails 项目的时候,对异常处理这一块有很多困惑,希望各位能帮我解惑,谢谢!下面是问题:
1.怎么处理在 Controller 里面抛出的异常?什么才是处理 Controller 异常的较好的实践?代码如下
class ProductsController < ApplicationController
def show
product_id = params[:product_id]
#如果product_id为空,那么我们是不是应该主动抛出ActiveRecord::RecordNotFound异常,然后交给ApplicationController然后使用rescue_from进行处理?
raise ActiveRecord::RecordNotFound unless product_id
#还是应该像下面这样不主动检测product_id,让程序自己在查找对应的product时抛出异常?
@product = Product.find(params[:product_id])
#如果交由ApplicationControlller统一处理同类型的异常,那么就意味着所有抛出此类型异常的代码之后的行为都是相同的(如添加错误信息,跳转)
#那么如果我有些可能抛出此类型异常的地方我不想跟其他地方一样抛出异常之后产生同样的行为,那么我应该怎么办?在Action中用begin-rescue-end块吗?这样会不会显得Action中的代码过于臃肿?
end
end
2.我们应不应该在 Model 中的方法内抛出或者处理异常?
class Product < ApplicationRecord
def title
self.name + ' ' + product_properties.map(&:value).join(' ')
end
#像上面这段代码,如果product没有name这个字段也没有name这个方法,那么会抛出一个NoMethodError异常,我们应该怎样处理它?
#产品发布到生产环境,怎么处理这些有可能在controller和model里面发生的异常才有更好的用户体验?
end