从开始抢救错误中返回变量

时间:2014-03-06 19:44:01

标签: ruby exception-handling return nameerror rescue

方法

def exp_backoff up_to, url, header = {}                                                                                      
  tries = 0                                                                                                                  
  begin                                                                                                                      
    tries += 1                                                                                                               
    response = JSON.parse(open(url, header).read)                                                                            

    return response                                                                                                          
  rescue OpenURI::HTTPError => e                                                                                             
    if tries < up_to                                                                                                         
      sleep( 2 ** tries )                                                                                                    
      retry                                                                                                                  
    else                                                                                                                     
      return e                                                                                                               
    end                                                                                                                      
  end                                                                                                                        
end   

我正在调用exp_backoff期待返回响应,但它不是

  exp_backoff 2, status_url                                                                                                  
  session_token = response['session_token']

获取此错误

undefined local variable or method `response' for main:Object (NameError)

2 个答案:

答案 0 :(得分:1)

您没有将返回值分配给任何内容。这将有效:

response = exp_backoff 2, status_url                                                                                                  
session_token = response['session_token']

但请注意,您的rescue部分将返回不同的对象,而response['session_token']将引发未定义的方法错误。也许你应该重新考虑一下你的方法?最有可能的是,您应该简单地重新加载异常对象,而不是返回异常对象:

rescue OpenURI::HTTPError                                                              
if tries < up_to                                                                                                         
  sleep( 2 ** tries )                                                                                                    
  retry                                                                                                                  
else                                                                                                                     
  raise                                                                                                       
end         

答案 1 :(得分:0)

您在方法response中定义的局部变量exp_backoff只能在exp_backoff的方法体中访问。您无法从该方法定义之外访问它。

当您将某个值分配给方法中的局部变量并返回该值时,变量赋值对方法外部没有影响。