2012-07-19 6 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 

나의 이해했다 그 구조 => 전자는 이전의 구조 문에 의해 체포되지 않은 모든 예외를 기록해야하며, 방법은 계속해야 실행 안녕하세요

SSL_connect 반환 = 1 개의 errno = 0 상태 = SSLv2의/v3을 읽을 서버 A : : 그러나 특정 URL의이 선택하는 몇 가지 이유를 들어, 스크립트는 다음과 같은 예외로 종료 알 수없는 프로토콜을

예외가 잡히면 인쇄되고 작업이 계속 실행되도록 어떻게 설정할 수 있습니까?

또한 메일러보기에서 렌더링되도록 결과 배열을 호출 할 수 있습니다. 이렇게하면 기존 메일러에 게시 취소 된 모든 제품을 추가 할 수있는 더 좋은 방법이 있습니까?

감사합니다.

답변

1

나는 당신의 첫번째 구조가 작동하는 유일한 것이라고 확신합니다. => e을 지정하면 Ruby에 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에 동의, 당신은 그런 식으로하지 말아야 –