2014-10-29 2 views
0

다음 코드를 사용하여 maxmind에 사용자 IP 주소의 geolocation을 쿼리합니다. maxmind의 서버에서 발생하는 모든 오류/시간 초과에 대비할 수 있는지 확인하고 싶습니다. 일부 유형의 rescue을 구현해야합니까? 그렇다면 무엇이 권장 되는가?구조 및이 외부 API 호출

uri = URI("https://geoip.maxmind.com/geoip/v2.1/city/#{request.remote_ip}?pretty") 

Net::HTTP.start(uri.host, uri.port, 
    :use_ssl => uri.scheme == 'https', 
    :verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http| 

    request = Net::HTTP::Get.new uri.request_uri 
    request.basic_auth 'USER_ID', 'KEY' 

    response = http.request request # Net::HTTPResponse object 

    if response.kind_of? Net::HTTPSuccess 
    location_hash = JSON.parse(response.body) 
    end 
end 

답변

1

모든 예외를 구출하려면

begin 
    #your code 
rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, 
    Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e 
    # do something with exception 
end 

또한 다른 구출을 넣어 하나의 오류를 구출 할 수 있습니다 (사용 쉼표를 한 번에 하나 이상의 구출) :

begin 
    # your code 
rescue Timeout::Error => e 

rescue Errno::EINVAL => e 

... 

end 
+0

# 당신이 말하는 코드는 실제로 위에서 사용 된 모든 코드가 시작과 복구 사이에 있음을 의미합니까? 미안해, 이젠 새로운데. – Abram

+0

네, 맞습니다. 예외를 발생시킬 수있는 모든 코드 행. 원하는 경우 uri = Uri (...) 행을 남겨 둘 수 있습니다. – iMacTia