2016-11-24 2 views
7

Ich verwende RestClient, um einen Netzwerkanruf in der Ruby-Klasse zu tätigen. Ich bekomme immer eine , wenn ich nicht mit dem Internet verbunden bin. Ich habe einen Rettungsblock hinzugefügt, um die Ausnahme zu erfassen, aber ich bin dazu nicht in der Lage.Wie Socket-Fehler in Ruby mit RestClient zu retten?

die Fehlermeldung: 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 

Die breite Rettung wird aufgerufen und Druck SocketError, aber warum die vorherigen rescue SocketError nicht ausgelöst!

Siehst du etwas, das ich vermisse?

+0

Ich denke Rest Kunde uns auch die Ausnahme und vorbei ist der Umgang, original Ausnahme war SocketError –

+1

Werfen Sie einen Blick auf diese https://github.com/rest-client/rest-client/blob/master/lib/restclient/exceptions.rb#L103 –

+0

@WishZone In ihren Dokumenten sagen sie, dass sie nicht tun mit wenigen Fehlern umgehen, einschließlich "SocketError", haben sie dennoch eine Möglichkeit, sie zu fangen? Ich füge auch das Backtrace oben hinzu. – aks

Antwort

1

Es gibt ein paar Ausnahmen, die Sie retten müssen, falls Sie fehlerfrei ausfallen möchten.

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') 

Da Sie Probleme haben, in Bezug auf die uri 404 Ziel sein, oder eine Domäne sein, die eine IP, nicht vorhanden, und so weiter.

Wie Sie oben sehen können, können Sie verschiedene Szenarien haben, die bei der Verbindung mit einem Remote-URI auftreten können. Der obige Code rettet die häufigsten Szenarien.

Der erste fehlt die URL, die von RestClient selbst behandelt wird.

Die folgenden drei unten sind ungültige Domänen, die mit SocketError fehlschlagen (im Grunde ein DNS-Fehler in diesem Fall).

schließlich in dem letzten Aufruf versuchen wir zu einer IP zu verbinden, die keine Server laufen hat - deshalb wirft es ein ERRNO :: ECONNREFUSED