1

我如何从一个

未定义的方法

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:语法错误,意外的关键字救援,期待关键字结束救援异常 => 异常

耙子 0.9.2.2 轨道 3.2.5

4

2 回答 2

4

用于try包装问题方法,如果不存在则返回 nil。例如:

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
于 2012-06-06T23:56:12.453 回答
3

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

Exception是 Ruby 异常层次结构的根,所以当你从一切rescue Exception中拯救出来时,包括诸如、和.SyntaxErrorLoadErrorInterrupt

如果您想了解更多信息,请查看为什么在 Ruby 中 `rescue Exception => e` 是一种不好的风格?

于 2014-10-01T19:38:23.680 回答