Ruby - правильно обрабатывает нулевые объекты - PullRequest
2 голосов
/ 14 января 2012

В ruby ​​я не совсем уверен, как обращаться с объектами, равными нулю или нет.

Например, у меня есть следующее:

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 .Поэтому я хотел бы, чтобы вместо него использовался следующий объект.

Есть ли способ сделать это без использования определенных исключений, мне было интересно, есть ли лучший способ сделать то, что мне нужно, после любого как.

1 Ответ

3 голосов
/ 14 января 2012

Проблема не в проверках, вы делаете это правильно. Все, что не ноль или ложь, верно в рубине. Дело в том, что когда вы получаете исключение в строке, которая начинается с "sp = ..", выполнение переходит к блоку resque. Вы должны реструктурировать код следующим образом (я удалил предложение sure, потому что я не знаю, что он делает). Хорошая вещь, чтобы сделать это, чтобы спасти каждый конкретный тип исключения в своем собственном ряду. по имени класса отл. 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

Для быстрого и неаккуратного программирования вы можете сделать что-то другое, но это не рекомендуется и, как правило, затрудняет отладку, поскольку любая ошибка приводит к нулю и отключается.

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

Таким образом, вы получите либо объект SerialPort, либо nil-объект в переменной sp, и то же самое для sp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...