Ruby on rails Net/SSH.start不';如果失败,则不会引发异常
我正在使用连接到另一台服务器。它工作正常,但我希望能够处理它无法连接的情况。因为这个方法没有提到任何异常,就我所知,它没有引起任何异常。在下面的示例中,传递不存在且没有键的主机和用户不会引发异常 我能检查它是否失败的唯一方法是查看@session,它将为零,但这并没有告诉我它失败的原因Ruby on rails Net/SSH.start不';如果失败,则不会引发异常,ruby-on-rails,ruby,exception,ssh,net-ssh,Ruby On Rails,Ruby,Exception,Ssh,Net Ssh,我正在使用连接到另一台服务器。它工作正常,但我希望能够处理它无法连接的情况。因为这个方法没有提到任何异常,就我所知,它没有引起任何异常。在下面的示例中,传递不存在且没有键的主机和用户不会引发异常 我能检查它是否失败的唯一方法是查看@session,它将为零,但这并没有告诉我它失败的原因 begin @session = Net::SSH.start('no-host', 'no-user', keys: []) rescue SocketError => e connection_
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
为什么这不会在我的应用程序中引发异常?使用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
参数指定连接超时。我正在尝试挽救一些异常,以下是对我有效的方法:
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
您使用的是什么版本的ruby?只要在irbruby-1.9.3p327中尝试SSH.start的第二行,我就会得到异常“SocketError:initialize:名称或服务未知”。在rails控制台中也可以正常工作。@agmcleod我在1.9.3-p194上,是的,你是对的。在irb中我得到一个例外,但是在应用程序中我没有。我有同样的问题。如果我使用了不正确的密码,则会引发异常,但当我的凭据正确时,它正在创建一个立即关闭的连接,但我无法找出它立即关闭的原因。使用Net::SSH.start有两种方法,带或阻止或不带。两者都得到了支持,正如我在问题中提到的那样,这对我很有效。关于超时,您是正确的,这将是一个好主意。