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 return = 1 errno = 0 state = SSLv2 / v3 read server hello 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 に答える