如何从耙子中的错误中解脱出来

时间:2012-06-06 23:43:34

标签: ruby-on-rails ruby-on-rails-3 rake ruby-on-rails-3.2

如何从

中拯救
  

未定义的方法

error in this code

for user in @users do
    @customer = Stripe::Customer.retrieve(user.stripe_customer_token)
        if @customer.subscription.nil?
        elsif @customer.subscription.plan.id == 2
          user.silver_reset
        elsif @customer.subscription.plan.id == 3
          user.gold_reset
      end
    end

我尝试过一次简单的救援电话,但是rake并不喜欢它。

从错误中拯救的方法是什么?

更新:

我这样做的方式

 for    user in @users do
            @customer = Stripe::Customer.retrieve(user.stripe_customer_token)
         rescue_from Exception => exception
          # Logic
        end
        if @customer.subscription.nil?
        elsif @customer.subscription.plan.id == 2
          user.silver_reset
        elsif @customer.subscription.plan.id == 3
          user.gold_reset
      end
    end

错误 /home/user/rails_projects/assignitapp/lib/tasks/daily.rake:25:语法错误,意外的keyword_rescue,期待keyword_end          救援Exception =>例外

耙子0.9.2.2 Rails 3.2.5

2 个答案:

答案 0 :(得分:4)

使用try包装问题方法,如果不存在则返回nil。 E.g:

unless @customer = Stripe::Customer.try(:retrieve, user.stripe_customer_token)
  # Logic
end

或者,这会导致更多错误:

unless @customer = Stripe::Customer.retrieve(user.stripe_customer_token) rescue nil
  # Logic
end

或者这是你想要的更多:

@users.each do |user|
  begin
    @customer = Stripe::Customer.retrieve(user.stripe_customer_token)
  rescue StandardError => error
     # handle error
  end
end

答案 1 :(得分:1)

我仍然没有足够的声誉来评论,但关于上述答案的第三个选项:不要从异常中抢救!

Exception是Ruby异常层次结构的根,所以当你rescue Exception拯救所有时,包括SyntaxError,{{1}等子类}和LoadError

如果您想了解更多信息,请查看Why is it a bad style to `rescue Exception => e` in Ruby?