我正在使用Net::SSH连接到另一台服务器。它工作正常,但我希望能够处理无法连接的情况。该方法的Documentation没有提及异常,只要我看到它不会引起任何异常。在以下示例中,传递不存在且没有键的主机和用户不会引发异常。
我可以检查它是否失败的唯一方法是查看@session,这将是零,但这并没有告诉我它失败的原因。
begin
@session = Net::SSH.start('no-host', 'no-user', keys: [])
rescue SocketError => e
connection_failed = true
logger.error "SOCKET ERROR: "+e.message
rescue Net::SSH::AuthenticationFailed
connection_failed = true
logger.error "AUTH ERROR: "+e.message
rescue Exception => e
logger.error "EXCEPTION: "+e.message
end
[更新]在irb中运行以下命令会引发SocketError:
> require 'net/ssh'
> Net::SSH.start('no-host', 'no-user', keys: [])
= SocketError: getaddrinfo: nodename nor servname provided, or not known
为什么这不会在我的应用中引发异常?
答案 0 :(得分:3)
我正在尝试拯救一些例外,这对我有用:
def mydef
begin
Net::SSH.start("host", "user", :password => "password", :timeout => 10) do |ssh|
#stuff
end
rescue Timeout::Error
@error = " Timed out"
rescue Errno::EHOSTUNREACH
@error = " Host unreachable"
rescue Errno::ECONNREFUSED
@error = " Connection refused"
rescue Net::SSH::AuthenticationFailed
@error = " Authentication failure"
end
end
然后可能在视图中使用@error
答案 1 :(得分:2)
start()
方法设置连接并将其输出到内部块。当你没有传递一个块时,就像在你的例子中一样,它可能连接都没有。你应该尝试做一个简单的循环或其他一些活动:
begin
Net::SSH.start('no-host', 'no-user', keys: []) do |ssh|
ssh.loop { true }
end
rescue SocketError => e
connection_failed = true
logger.error "SOCKET ERROR: "+e.message
rescue Net::SSH::AuthenticationFailed
connection_failed = true
logger.error "AUTH ERROR: "+e.message
rescue Exception => e
logger.error "EXCEPTION: "+e.message
end
此外,如果您担心错误处理和失败,则应通过:timeout
参数指定连接超时。