2011-05-08 51 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」這使得它看起來像這是被拋出的異常。