我在用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
没有被触发!
你看到我缺少的东西了吗?
如果您想优雅地失败,则需要挽救一些例外情况。
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)