Ruby 如果失败,则循环下一步

Ruby 如果失败,则循环下一步,ruby,exception-handling,Ruby,Exception Handling,我有以下代码尝试连接到各种主机并移动数据。问题是,如果一次连接尝试失败,那么代码就会失效。如何使其移动到阵列中的下一个主机 h=%w"host1 host2 host3 host4" h.each do |hostname| tn = Net::Telnet::new("Host" => "#{hostname}", "Timeout" => false,

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

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

通过处理由
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,或未知

也就是说,您实际上没有提供主机名。该参数不称为
“主机”
,它称为
“主机”
,案例很重要。Ruby选项通常也作为符号而不是字符串传递。试试这个:

  tn = Net::Telnet::new(:host    => "#{hostname}",
                        :timeout => false,
                        :prompt  => /[$%#>] \z/n)
现在,您将得到预期的错误:

无法连接到主机1:连接被拒绝-连接(2)


谢谢,我认为这需要一个try-catch块(从ruby开始),但我确定如何使用rescue语句。工作得很好!