Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to rescue Socket Error in Ruby with RestClient?

I am using RestClient to make a network call in the ruby class. I am getting a SocketError whenever I am not connected to the internet. I have added a rescue block to catch the exception still I am not able to do so.

the error message is: 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

The broad rescue gets called and print SocketError, but why the previous rescue SocketError is not triggered!

Do you see something that I am missing?

like image 982
aks Avatar asked Nov 24 '16 06:11

aks


1 Answers

There are a couple of exceptions you'll need to rescue in case you want to fail gracefully.

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

Because you can have problems regarding the uri being a 404 destination, or be a domain that doesn't existing, an IP, and so on.

As you can see above, you can have different scenarios that you may encounter when dealing with connecting to a remote uri. The code above rescue from the most common scenarios.

The first one the URL is missing, which is handled by RestClient itself.

The the following three below are invalid domains, which will fail with SocketError (basically a DNS error in this case).

Finally in the last call we try to connect to an IP that has no server running on it - therefore it throws an ERRNO::ECONNREFUSED

like image 118
Jonathan Duarte Avatar answered Oct 19 '22 08:10

Jonathan Duarte