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

我的理解是,rescue => e 应该记录之前的救援语句未捕获的所有异常,并且该方法应该继续运行,但是由于某种原因,当检查某些 URL 时,脚本退出并出现以下异常:

SSL_connect 返回=1 errno=0 state=SSLv2/v3 读取服务器你好 A:未知协议

我该如何设置它,以便如果捕获到异常,它将被打印,并且任务将继续运行?

另外,如何调用结果数组以在邮件视图中呈现,有没有更好的方法可以将所有未发布的产品添加到已经存在的邮件中?

谢谢!

4

2 回答 2

1

我很确定你的第一次救援将是唯一有效的。指定=> e只是告诉 Ruby 将异常存储在一个名为e. 我认为您的第一个救援块中的代码正在引发您看到的错误,并且没有其他任何东西可以挽救它。老实说,这是一堆乱七八糟的代码,最好将其重构为更小的方法。

于 2012-07-19T21:20:47.803 回答
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
于 2012-07-19T21:23:07.203 回答