假设我有一个填充了IP地址的数组。现在说我有一个方法试图连接到数组中的每个主机。在这个特定的实例中,我不需要知道有关失败连接的任何细节,我只想跳到下一个主机,如果一个连接失败或者抛出任何错误。我该怎么做呢?
我遇到的问题是,偶尔,当连接到其中一个主机时,程序将抛出ENETUNREACH错误,然后终止该程序。我尝试通过解救错误来解决它,但接下来发生的是程序将停止执行而不会抛出任何错误。如何让它跳过数组中的主机,然后转到下一个主机?
def popen(host)
addr = Socket.getaddrinfo(host, nil)
sock = Socket.new(Socket.const_get(addr[0][0]), Socket::SOCK_STREAM, 0)
begin
sock.connect_nonblock(Socket.pack_sockaddr_in(22, addr[0][3]))
rescue Errno::EINPROGRESS
resp = IO.select(nil, [sock], nil, @timeout.to_i)
if resp.nil?
false
end
begin
if sock.connect_nonblock(Socket.pack_sockaddr_in(22, addr[0][3]))
sshlog(host, @user, @pass)
end
rescue Errno::ECONNREFUSED
false
end
end
sock
end
这是连接方法。这个:
def randIP
begin
threads = []
if @arg1 =~ /^([1-9][0-9]{0,2}|1000)$/
t1 = Time.now
s = 1
while s <= @arg1.to_i do
@host_arr << Array.new(4){rand(254)}.join('.')
s += 1
end
@host_arr.each do |ip|
threads << Thread.new do
begin
popen(ip)
rescue Errno::ENETUNREACH
end
end
end
threads.each do |thread|
thread.join
end
t2 = Time.now
time = t2 - t1
STDOUT.puts "done"
proxylst(@res_arr, @user, @pass)
else
puts "Host range too large! Must be a number between 1 and 1000."
end
rescue
false
end
end
是一种生成随机IP地址的方法,将它们放入数组中,并使用上面的popen方法尝试在每个主机上建立连接。考虑到随机IP地址生成的性质,1000个主机中至少有一个将无效或以某种方式无法访问。所以我需要的是一种尝试数组中每个主机跳过任何抛出错误的方法。
答案 0 :(得分:0)
通常我如何处理这个是这样的:
exception_array = []
Connections.each do |con|
begin
#connection code
rescue Exception => e
exception_array << e
end
end
unless exception_array.empty?
msg = ""
exception_array.each do |e|
msg << e.to_s
end
raise msg
end
通过这种方式,您可以跟踪所有抛出的异常,而不会在失败时破坏代码。