【问题标题】:Return a variable from a begin rescue error从开始救援错误中返回一个变量
【发布时间】:2014-03-06 19:44:00
【问题描述】:

方法

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)

【问题讨论】:

  • 所以您的期望是begin 块中的某些内容会引发异常,这样您就会遇到rescue 块?对吗?

标签: ruby exception-handling return nameerror rescue


【解决方案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         

【讨论】:

  • 感谢也发现了 NoMethodError。我返回 nil 是因为它更符合我的目的
【解决方案2】:

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

当您在方法内为局部变量赋值并返回该值时,变量赋值对方法外部没有影响。

【讨论】:

    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    相关资源
    最近更新 更多