2012-07-19 342 views
1

我有檢查損壞的鏈接方法:異常處理

def self.check_prod_links 
    require 'net/http' 
    results = [] 
    Product.find_each(:conditions =>{:published => 1}) do |product| 
    url = product.url 
    id = product.id 
    uri = URI(url) 
    begin 
     response = Net::HTTP.get_response(uri) 
    rescue 
     http = Net::HTTP.new(uri.host, uri.port) 
     http.use_ssl = true 
     http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
     request = Net::HTTP::Get.new(uri.request_uri) 
     response = http.request(request) 
    rescue 
     response = Net::HTTP.get_response("http://" + uri) 
    rescue => e 
     p "Problem getting url: #{url} Error Message: #{e.message}" 
    end 
    p "Checking URL = #{url}. ID = #{id}. Response Code = #{response.code}" 
    unless response.code.to_i == 200 
     product.update_attribute(:published, 0) 
     results << product 
    end 
    end 
    return results 
end 

我的理解是,救援=>電子應登錄受先前救援陳述抓住所有的異常,並且該方法應繼續運行然而對於當某些URL的檢查某種原因,腳本與以下異常退出:

所以SSL_connect返回= 1個錯誤號= 0狀態=的SSLv2/v3的讀取服務器問候答: 未知協議

我如何設置此所以,如果一個異常被捕獲,它會被打印,任務將繼續運行?

另外,我怎麼能叫的結果數組中的郵件視圖渲染,有沒有更好的方式來做到這一點,這樣我可以補充一點,是未發佈到已經存在的所有郵件產品?

謝謝!

回答

1

我敢肯定,你的第一個救援將是唯一可行的。指定=> e只是告訴紅寶石存儲在一個名爲e變量除外。我正在考慮你的第一個救援塊中的代碼正在提高你所看到的錯誤,而且沒有其他任何救援措施。說實話,這是一團糟的代碼,你可能會更好地將它重構成更小的方法。

0

其實你不能挽救這樣的,因爲你的救援逃脫所有異常。您可以嵌套救援這樣的:

require 'net/http' 

    def check_prod_links 
     url = 'http://githuasdasdab.com' 
     uri = URI(url) 
     begin 
     puts '1' 
     response = Net::HTTP.get_response(uri) 
     puts '2' 
     rescue 
     begin 
      puts '3' 
      http = Net::HTTP.new(uri.host, uri.port) 
      http.use_ssl = true 
      http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
      request = Net::HTTP::Get.new(uri.request_uri) 
      response = http.request(request) 
      puts '4' 
     rescue 
      begin 
      puts '5' 
      response = Net::HTTP.get_response("http://" + uri) 
      puts '6' 
      rescue => e 
      puts '7' 
      p "Problem getting url: #{url} Error Message: #{e.message}" 
      end 
     end 
     end 
     puts '8' 
     if response 
     p "Checking URL = #{url}. Response Code = #{response.code}" 
     unless response.code.to_i == 200 
     end 
     end 
    end 

    check_prod_links 

它產生

1 
    3 
    5 
    7 
    "Problem getting url: http://githuasdasdab.com Error Message: can't convert URI::HTTP into String" 
    8 
+0

和我一起@beerlington它是一個爛攤子同意,你不應該這樣做的 – 2012-07-19 21:24:21