Проблема не в проверках, вы делаете это правильно. Все, что не ноль или ложь, верно в рубине. Дело в том, что когда вы получаете исключение в строке, которая начинается с "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.