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语句。工作得很好!