2011-08-28 3 views
4
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 트위터로 재 게시 관찰자가 정의되지.루비 나가서 설명하자면 NameError 로컬 변수 또는 방법 E '

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>' 

나는 여기에 놓치고 무엇 : I 가끔 다음과 같은 예외가?

+1

이상하지만 흥미 롭습니다.'=> e'가없는 것처럼 보입니다. –

+1

참고 :'Exception'을 구출하지 말고 대신'StandardError'를 구하십시오. http://www.thattommyhall.com/2011/02/24/rescue-exception-harmful-signals-in-ruby/ – zetetic

답변

2

나는 내가 아는 한 가지는 물론 야생의 추측이다.

내가 아는 것은 전체 #{} 표현에 to_s을 호출 할 필요가 없다는 것입니다. 그건 자동으로 일어날거야. 하지만 아무런 해가 없습니다.

내 생각에 귀하의 테스트 케이스가 실제로 게시 한 코드를 실행하지 않는다는 것입니다. ef으로 변경하면 어떻게됩니까?

예외 자체를 구하는 것은 대개 잘못된 생각입니다. RuntimeError 또는 StandardError를 가장 높은 단계에서 구해야합니다. 스레드 및 인터프리터 수준의 이벤트를 방해하기 때문에 Exception을 구할 때 상당히 이상한 오류가 발생할 수 있습니다.

+0

메소드를 Twitter :: Error 만 구조로 변경했습니다. 문제가 해결되었는지 확인하기 위해 테스트에 넣습니다. –

-1

begin/rescue 절의 'begin'블록이 누락되었습니다.

+2

아니,이 구문을 사용하여 함수에서 구조 할 수 있습니다. 이것은 유효한 루비입니다. –

관련 문제