2011-08-24 15 views
8

मैं रूबी (1.8.6) में "ओपन-यूरी" का उपयोग करके लिंक की सूची से सामग्री को संसाधित करने की कोशिश कर रहा हूं, लेकिन जब मैं हूं तो बुरी चीज होती है एक त्रुटि हो रही है जब एक लिंक टूटी हुई है या प्रमाणीकरण की आवश्यकता:किसी भी डेटा को प्रोसेस करने से पहले ओपन-यूरी यूआरएल का परीक्षण कैसे करें

open-uri.rb:277:in `open_http': 404 Not Found (OpenURI::HTTPError) 
from C:/tools/Ruby/lib/ruby/1.8/open-uri.rb:616:in `buffer_open' 
from C:/tools/Ruby/lib/ruby/1.8/open-uri.rb:164:in `open_loop' 
from C:/tools/Ruby/lib/ruby/1.8/open-uri.rb:162:in `catch' 

या

C:/tools/Ruby/lib/ruby/1.8/net/http.rb:560:in `initialize': getaddrinfo: no address associated with hostname. (SocketError) 
from C:/tools/Ruby/lib/ruby/1.8/net/http.rb:560:in `open' 
from C:/tools/Ruby/lib/ruby/1.8/net/http.rb:560:in `connect' 
from C:/tools/Ruby/lib/ruby/1.8/timeout.rb:53:in `timeout' 

या

C:/tools/Ruby/lib/ruby/1.8/net/protocol.rb:133:in `sysread': An existing connection was forcibly closed by the remote host. (Errno::ECONNRESET) 
from C:/tools/Ruby/lib/ruby/1.8/net/protocol.rb:133:in `rbuf_fill' 
from C:/tools/Ruby/lib/ruby/1.8/timeout.rb:62:in `timeout' 
from C:/tools/Ruby/lib/ruby/1.8/timeout.rb:93:in `timeout' 

वहाँ का परीक्षण करने के लिए एक रास्ता है किसी भी डेटा को संसाधित करने से पहले प्रतिक्रिया (यूआरएल)?

कोड है:

require 'open-uri' 

smth.css.each do |item| 
open('item[:name]', 'wb') do |file| 
    file << open('item[:href]').read 
end 
end 

बहुत धन्यवाद

उत्तर

23

आप

require 'open-uri' 

    smth.css.each do |item| 
    begin 
     open('item[:name]', 'wb') do |file| 
     file << open('item[:href]').read 
     end 
    rescue => e 
     case e 
     when OpenURI::HTTPError 
     # do something 
     when SocketError 
     # do something else 
     else 
     raise e 
     end 
     rescue SystemCallError => e 
     if e === Errno::ECONNRESET 
     # do something else 
     else 
     raise e 
     end 
    end 
    end 

की तर्ज पर कुछ मैं बिना खोले ही कनेक्शन का परीक्षण करने के लिए किसी भी तरह का पता नहीं है की कोशिश कर सकते यह और कोशिश कर रहा है, इसलिए इन त्रुटियों को बचाने का एकमात्र तरीका होगा जिसके बारे में मैं सोच सकता हूं। इस बारे में जागरूक होने की बात यह है कि OpenURI :: HTTPError और SocketError दोनों मानक एरर के उप-वर्ग हैं, जबकि एरर्नो :: ECONNRESET SystemCallError का उप-वर्ग है। तो बचाव => ई Errno :: ECONNRESET पकड़ नहीं होगा।

0

मैं अगर/किसी और बयान "विफलता" के लिए कार्रवाई की वापसी मान की जाँच करने के एक सशर्त का उपयोग करके इस समस्या को हल करने में सक्षम था:

def controller_action 
    url = "some_API" 
    response = open(url).read 
    data = JSON.parse(response)["data"] 
    if response["status"] == "failure" 
     redirect_to :action => "home" 
    else 
     do_something_else 
    end 
end 
+0

यह त्रुटि पकड़ नहीं करता है 'SocketError (खोलने में विफल Jsonipsdf.com:443 के लिए टीसीपी कनेक्शन (getaddrinfo: nodename और न ही सर्वोनाम प्रदान किया गया है, या ज्ञात नहीं है): ' – Whitecat