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

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

错误消息是: 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没有被触发!

你看到我遗失的东西吗?

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

 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