如何使用RestClient拯救Ruby中的套接字错误?

时间:2016-11-24 06:11:24

标签: ruby-on-rails ruby sockets

我正在使用RestClient在ruby类中进行网络调用。每当我没有连接到互联网时,我都会收到SocketError。我已经添加了一个救援块以捕获异常,但我仍然无法这样做。

错误信息是: 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未被触发!

你看到我遗失的东西吗?

1 个答案:

答案 0 :(得分:5)

如果你想要优雅地失败,你需要拯救一些例外。

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