Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Net/SSH.start不';如果失败,则不会引发异常_Ruby On Rails_Ruby_Exception_Ssh_Net Ssh - Fatal编程技术网

Ruby on rails Net/SSH.start不';如果失败,则不会引发异常

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_

我正在使用连接到另一台服务器。它工作正常,但我希望能够处理它无法连接的情况。因为这个方法没有提到任何异常,就我所知,它没有引起任何异常。在下面的示例中,传递不存在且没有键的主机和用户不会引发异常

我能检查它是否失败的唯一方法是查看@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
为什么这不会在我的应用程序中引发异常?

使用
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有两种方法,带或阻止或不带。两者都得到了支持,正如我在问题中提到的那样,这对我很有效。关于超时,您是正确的,这将是一个好主意。