我正在使用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呢!

看到我想念的东西了吗?

最佳答案

有一些异常(exception)情况需要您挽救,以防万一您要正常失败。

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

10-08 14:32