2013-03-22 44 views
2

我不是程序員,並且知道Ruby語言很少。我有一個從網站獲取產品信息的報廢程序,我試圖添加一個救援代碼來處理HTTP 404錯誤,所以它不會結束報廢,而是繼續下一個產品。如何在我的報廢中處理「404錯誤」?

我需要救援加入到下面的代碼:先進

 def initialize(id, log = nil, timeout_threshold = nil) 

      @log_buffer = nil 
      # prepare internal logging stream 
      @log = (!log.nil? and log.is_a?(Logger)) ? log : Logger.new(@log_buffer=StringIO.new) 

      begin   
       # store instance url address 
       @id = id.to_s 
       @url = Link::base_url + 'en-US/item_' + @id + '.htm' 

       # set remote timeout threshold 
       @timeout_threshold = (timeout_threshold.to_i > 0) ? timeout_threshold.to_i : 15 
       @timeout = false 

       @expired = false 

       if url_verify 
        Timeout::timeout(@timeout_threshold) { 
         Mechanize.html_parser = Nokogiri::HTML 
         @@agent = Agent.instance 

         ###TODO: [optional?] login 
         ###TODO: [optional?] or login iff pricing not present? 
         ###TODO: Agent.get(user login page) 
         ###TODO: Agent.fill in user/pswd 
         ###TODO: Agent.submit 

         @html = @@agent.get(url) 
         @log.info("Alamode Product #{@id.to_s}: Load #{url.to_s}") 

         @specification = parse_specifications 
         @quantity, @mapped_quantity = parse_quantities 
         @price = parse_price 
         @valid = true 

         # check parsed page 
         if @specification.size.zero? and @quantity.size.zero? 
          @valid = false 
          @expired = true 
          @log.warn("Alamode Product #{@id.to_s}: #{url.to_s} unscrappable (product no longer available?)") 
         else 
          @log.info("stAlamode Product #{@id.to_s}: #{url.to_s} successfully parsed") 
          @log.info(" QTY #{@mapped_quantity.to_s}") 
         end 
        } 

       else 
        # return error message 
        @valid = false 
        @log.error("Alamode Product #{@id.to_s}: #{url.to_s} is not a properly formatted URI address") 
       end 

      rescue Timeout::Error 
       @valid = false 
       @timeout = true 
       @log.error("Alamode Product #{@id.to_s}: #{url.to_s} did not respond within allocated time")  
      end 

     end 

感謝。

回答

0

Ruby允許您堆疊救援條款。

begin 
    ... 
rescue YourErrorName 
    ... 
rescue Timeout::Error 
    ... 
end 

在新的條款,你可以退出悄然(什麼都不做 - 更好的記錄結果),或者開始下一個ID報廢。 我對Nokogiri不熟悉,所以你必須自己弄清錯誤名稱;) 祝你好運!