如果失败则循环下一步

时间:2012-01-03 17:53:03

标签: ruby exception-handling

我有以下代码尝试连接到各种主机并移动数据。问题是如果一个连接尝试失败,那么代码就会死掉。如何让它移动到阵列中的下一个主机。

h=%w"host1 host2 host3 host4"

h.each do |hostname|

  tn = Net::Telnet::new("Host" => "#{hostname}",
                               "Timeout" => false,
                               "Prompt" => /[$%#>] \z/n)

  tn.cmd('String' =>'user' , 'Match'=>/Password:/) { |c| puts c }
  tn.cmd('String' =>'password', 'Match'=>/#/) { |c| puts c }


      tn.cmd('String' =>"show run | redirect tftp://192.1.1.1/#{hostname}-#{tdate}.cfg", 'Match'=>/#/) { |c| puts c }
      sleep(3)


end

1 个答案:

答案 0 :(得分:1)

通过处理Net::Telnet::initialize引发的异常,您可以继续第一次失败的连接尝试。你会发现你没有得到你认为你得到的错误:

begin
  tn = Net::Telnet::new("Host" => "#{hostname}",
                        "Timeout" => false,
                        "Prompt" => /[$%#>] \z/n)
rescue => e
  puts "Unable to connect to #{hostname}: #{e.message}"
  next
end

可生产

  

无法连接到host1:getaddrinfo:提供的nodename或servname,或者未知

也就是说,您实际上并未提供主机名。该参数不称为"Host",它被称为"host",并且案例很重要。 Ruby选项通常也作为符号传递,而不是 strings 。试试这个:

  tn = Net::Telnet::new(:host    => "#{hostname}",
                        :timeout => false,
                        :prompt  => /[$%#>] \z/n)

现在你会得到你期待的错误:

  

无法连接到host1:连接被拒绝 - 连接(2)