如果抛出错误,则跳到数组中的下一个主机

时间:2014-09-26 20:18:14

标签: ruby

假设我有一个填充了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个主机中至少有一个将无效或以某种方式无法访问。所以我需要的是一种尝试数组中每个主机跳过任何抛出错误的方法。

1 个答案:

答案 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

通过这种方式,您可以跟踪所有抛出的异常,而不会在失败时破坏代码。