【问题标题】:Ruby - Handling null objects properlyRuby - 正确处理空对象
【发布时间】:2012-01-14 07:30:49
【问题描述】:

在 ruby​​ 中,我不太确定如何处理对象是否为 nil。

例如我有以下内容:

begin
    sp = SerialPort.new(@serial_device, @serial_bps, @serial_par, @serial_bits, SerialPort::NONE)
    tcp = TCPSocket.new(@host, @port)

    if (sp)
        sp.print(command)
        sp.close
    elsif
        tcp.print(command)
        tcp.close
    end

    say siri_output
rescue
    pp $!
    puts "Sorry, I encountered an error: #{$!}"
ensure
    request_completed 
end

问题是第一个对象返回了一个错误:

No route to host - connect(2)

这是正确的,因为 TCP 没有连接duh。所以我希望它改用下一个对象。

有没有办法在不使用某些异常的情况下做到这一点,我想知道是否有更好的方法来做我想做的事情。

【问题讨论】:

  • 你不能使用一个函数来检查它的可用性然后建立连接吗?
  • obj.nil? - 检查对象是否为零的红宝石方法

标签: ruby exception object


【解决方案1】:

问题不在于检查,您做对了。任何不是 nil 或 false 的东西在 ruby​​ 中都是正确的。就是当您在以“sp = ..”开头的行上遇到异常时,执行会跳转到 resque 块。您应该像这样重构代码(我删除了 ensure 子句,因为我不知道它的作用)。一件好事是在它自己的行中拯救每一种特定类型的异常。按类名前。 NoConnectivityException => e(或异常的类别)。

 begin
     sp = SerialPort.new(@serial_device, @serial_bps, @serial_par, @serial_bits, SerialPort::NONE)
     sp.print(command)
     sp.close
     say siri_output
 rescue Exception => e
     puts "Sorry, I encountered an error: #{e.inspect}"
     puts "trying TCP"
     begin
         tcp = TCPSocket.new(@host, @port)
         tcp.print(command)
         tcp.close
         say siri_output
     rescue Exception => e
         puts "Sorry, I encountered an error: #{e.inspect}"
     end
 end

对于快速而草率的编程,您可以做另一件事,但不建议这样做,通常调试起来很痛苦,因为任何错误都会导致 nil 并被静音。

sp = SerialPort.new(@serial_device, @serial_bps, @serial_par, @serial_bits, SerialPort::NONE) rescue nil
tcp = TCPSocket.new(@host, @port) rescue nil

这样你最终会在 sp 变量中得到一个 SerialPort 对象或 nil 对象,对于 sp 也是如此。

【讨论】:

  • ensure 的结构类似于 Java 或 C# 中的 finally
  • 是的,我知道。我只是不明白该子句在此处的含义是什么,如果您有全部例外情况,那么您可以将其放在整个开始/救援之外。仅当您重新抛出异常或某些异常可以通过时才需要这样做。另外,“request_completed”有什么作用?网络东西是如何连接到“siri_output”的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多