2016-11-24 25 views
7

我正在使用RestClient在ruby類中進行網絡調用。無論何時我沒有連接到互聯網,我都會收到SocketError。我已經添加了一個救援塊來捕捉異常,但我仍然無法這樣做。如何用RestClient解救Ruby中的套接字錯誤?

的錯誤信息是: 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

我認爲REST客戶端也處理異常,並傳遞給我們,原來異常是SocketError –

+1

看看這個https://github.com/rest-client/rest-client/blob/master/lib/restclient/exceptions.rb#L103 –

+0

@WishZone在他們的文檔中,他們說他們沒有處理一些錯誤,包括'SocketError',如果他們正在做,我們有辦法抓住他們嗎? 我也在上面添加了回溯。 – 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') 

因爲您可能在uri是404目標,或者是不存在的域,IP等等方面存在問題。

正如你在上面看到的,你可能會遇到不同的情況,你可能會遇到連接到遠程uri時遇到的問題。上面的代碼從最常見的場景中拯救出來。

第一個URL丟失,由RestClient自己處理。

下面的三個是無效的域,它們將以SocketError失敗(在這種情況下基本上是一個DNS錯誤)。

終於在最後一次通話,我們嘗試連接到沒有服務器上運行的IP - 所以它拋出一個ERRNO :: ECONNREFUSED