新手问题 Ruby 抛出异常后为什么不执行 rescue 中的语句了

return · 2017年01月14日 · 最后由 return 回复于 2017年01月17日 · 2863 次阅读
def current_cart
  Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
  cart = Cart.create
  session[:cart_id] = cart.id
  cart
end

debug 模式,都不进入 cart = Cart.create 但是如果去掉 ActiveRecord::RecordNotFound,会执行 rescue 后的语句,这是什么原因

另外 cart = Cart.create 总会报参数不对,求解!谢谢 @lyfi2003 @huacnlee

你需要确认一下 rescue 之后的异常到底是什么。

puts $!.class

应该是没捕到对应的异常

直接使用 find_or_create_by

为什么我行?

正常来说 Cart.find(session[:cart_id]) 是按 id find, 找不到就应该会抛出 ActiveRecord::RecordNotFound

#2 楼 @lyfi2003 抛出的异常是:ArgumentError (wrong number of arguments (0 for 1)): 很奇怪

ArgumentError (wrong number of arguments (0 for 1)):
  app/models/cart.rb:2:in `<class:Cart>'
  app/models/cart.rb:1:in `<top (required)>'
  app/controllers/application_controller.rb:7:in `current_cart'
  app/controllers/line_items_controller.rb:43:in `create'

car.rb 中

lass Cart < ActiveRecord::Base
  has_many :line_items, :dependent => destroy
  # attr_accessible :title, :body
end

#1 楼 @roccia 谢谢,这样是可以解决问题,但是我不太清楚为什么会抛异常: ArgumentError (wrong number of arguments (0 for 1)): ....

谢谢大家了😀

Cart.find(session[:cart_id])

这里的 session[:cart_id] 是 nil,所以抛这个异常了 ArgumentError (wrong number of arguments (0 for 1)):

find 只能查找id,没有则抛出异常;
Cart.find_by(id: session[:cart_id])

#9 楼 @kimmg 传 nil 是不可能报 argument error 的,他的 cart.rb 写的有问题,报错在 cart.rb:2

has_many :line_items, :dependent => destroy

destroy 加冒号

has_many :line_items, :dependent => :destroy

#12 楼 @piecehealth 是的,就是这个问题,以后写代码要细致了,谢谢大家😁

需要 登录 后方可回复, 如果你还没有账号请 注册新账号