2011-05-08 65 views
12

我写了简单的函数,它处理撷取网址的:追赶机械化404 =>网:: HTTPNotFound

def tender_page_get url, agent 
    sleep(rand(6)+2) 
    begin 
    return agent.get(url).parser 
    rescue Errno::ETIMEDOUT, Timeout::Error, Net::HTTPNotFound 
    EYE.debug "--winter sleep #{url}" 
    puts "-x-#{url}" 
    sleep(300) 
    tender_page_get url, agent 
    rescue => e 
    puts "-x-#{url}" 
    EYE.debug "--unknown exception" 
    EYE.debug "#{url} #{e.inspect}" 
    end 
end 

的问题是,即使我在我的第一个救援块醒目Net::HTTPNotFound,我仍然看到在我的日志记录如下:

--unknown exception 
{url} 404 => Net::HTTPNotFound 

这意味着这个异常被第二个救援块捕获。这可能是什么原因?

回答

18

机械化为404而不是Net :: HTTPNotFound引发了Mechanize :: ResponseCodeError。在机械化:: ResponseCodeError的to_s看起来是这样的:

def to_s 
    "#{response_code} => #{Net::HTTPResponse::CODE_TO_OBJ[response_code]}" 
end 

这将返回“404 =>网:: HTTPNotFound”这使得它看起来像这是被抛出的异常。