2016-11-24 6 views
7

मैं रूबी क्लास में नेटवर्क कॉल करने के लिए RestClient का उपयोग कर रहा हूं। जब भी मैं इंटरनेट से कनेक्ट नहीं हूं, मुझे SocketError मिल रहा है। मैंने अपवाद को पकड़ने के लिए एक बचाव ब्लॉक जोड़ा है, फिर भी मैं ऐसा करने में सक्षम नहीं हूं।रूबी में सॉकेट त्रुटि को RestClient के साथ कैसे बचाएं?

त्रुटि संदेश है: SocketError (Failed to open TCP connection to api.something.com:443 (getaddrinfo: Name or service not known))

module MyProject 
    class Client 
    def get_object(url, params={}) 
     response = RestClient.get(url, {params: params}) 
    rescue SocketError => e 
     puts "In Socket errror" 
    rescue => e 
     puts (e.class.inspect) 
    end 
    end 
end 

व्यापक बचाव को फोन किया और प्रिंट SocketError हो जाता है, लेकिन क्यों पिछले rescue SocketError ट्रिगर नहीं कर रहा है!

क्या आप ऐसा कुछ देखते हैं जो मुझे याद नहीं है?

+0

मुझे लगता है कि बाकी ग्राहक भी अपवाद हैंडलिंग और हमारे लिए गुजर रहा है, मूल अपवाद सॉकेटइर –

+1

इस https://github.com/rest-client/rest-client/blob/master/lib/restclient/exceptions.rb#L103 –

+0

@WishZone पर उनके दस्तावेज़ों पर एक नज़र डालें, वे कहते हैं कि वे नहीं करते हैं 'सॉकेट इरर' सहित कुछ त्रुटियों को संभालें, फिर भी यदि वे कर रहे हैं, तो क्या हमारे पास उन्हें पकड़ने का कोई तरीका है? मैं ऊपर बैकट्रैक भी जोड़ रहा हूं। – aks

उत्तर

1

कुछ अपवाद हैं जिन्हें आप आसानी से असफल होने के मामले में बचाव करने की आवश्यकता होगी।

require 'rest-client' 
def get_object(url, params={}) 
    response = RestClient.get(url, {params: params}) 
rescue RestClient::ResourceNotFound => e 
    p e.class 
rescue SocketError => e 
    p e.class 
rescue Errno::ECONNREFUSED => e 
    p e.class 
end 

get_object('https://www.google.com/missing') 
get_object('https://dasdkajsdlaadsasd.com') 
get_object('dasdkajsdlaadsasd.com') 
get_object('invalid') 
get_object('127.0.0.1') 

क्योंकि आप एक 404 गंतव्य जा रहा है uri के बारे में समस्या है, या एक डोमेन है कि मौजूदा नहीं करता है, एक आईपी, और इतने पर हो सकता है।

जैसा कि आप ऊपर देख सकते हैं, आप रिमोट यूरी से कनेक्ट होने पर निपटने के दौरान कई अलग-अलग परिदृश्यों का सामना कर सकते हैं। सबसे आम परिदृश्यों से बचाव के ऊपर कोड।

पहला यूआरएल गुम है, जिसे RestClient द्वारा ही नियंत्रित किया जाता है।

नीचे दिए गए तीन नीचे अमान्य डोमेन हैं, जो सॉकेटएरर (मूल रूप से इस मामले में एक DNS त्रुटि) के साथ विफल हो जाएंगे।

अंत में आखिरी कॉल में हम एक आईपी कोई सर्वर उस पर चल रहा है कनेक्ट करने का प्रयास - इसलिए यह एक errno फेंकता :: ECONNREFUSED

संबंधित मुद्दे