Ruby NameError未定义的局部变量或方法`e

时间:2011-08-28 18:34:33

标签: ruby exception

class TwitterProfile < ActiveRecord::Base

  def send_status_update(status_update)
    if publish?
      client = Twitter::Client.new( :oauth_token => authentication.token,
                           :oauth_token_secret => authentication.secret)
      client.update(status_update.to_twitter_string)
    end
  rescue Exception => e
    logger.info "Error publishing to twitter: #{e.to_s}"
  end
end

有一个StatusUpdate模型和一个观察者将它们重新发布到after_create中的Twitter。我有时得到以下异常:

NameError (undefined local variable or method `e' for #<TwitterProfile:0x00000004e44ab8>):
app/models/twitter_profile.rb:23:in `rescue in send_status_update'
app/models/twitter_profile.rb:18:in `send_status_update'
app/models/status_update_observer.rb:6:in `block in after_create'
app/models/status_update_observer.rb:4:in `after_create'
app/models/workout_observer.rb:5:in `after_update'
app/controllers/frames_controller.rb:76:in `update'
app/controllers/application_controller.rb:24:in `call'
app/controllers/application_controller.rb:24:in `block (2 levels) in <class:ApplicationController>'
app/controllers/application_controller.rb:10:in `block in <class:ApplicationController>'

我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

我有一件事我知道,而且只是一个猜测。

我知道的是你不需要在整个to_s表达式上调用#{};这将自动发生。但它没有坏处。

我猜测你的测试用例并没有真正运行你发布的代码。如果您将e更改为f会怎样?

我应该注意到,拯救Exception本身通常是一个坏主意。您应该以最高的方式挽救RuntimeError或StandardError,最好是更具体的东西。在抢救Exception时可能会遇到相当奇怪的错误,因为您会干扰线程和解释器级事件。

答案 1 :(得分:-2)

你错过了begin / rescue子句的'begin'块。