2012-01-14 5 views
2

루비에서는 객체가 무효인지 아닌지를 어떻게 처리할지 잘 모르겠습니다. 예를 들어Ruby - null 객체를 올바르게 처리하기

나는 다음과 같은 한 :

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 

문제를 첫 번째 개체가 관련된 오류를 반환한다는 것입니다 : TCP가 연결되어 있지 않기 때문에, 정확한

No route to host - connect(2)

duh. 그래서 대신 다음 객체를 사용하고 싶습니다.

특정 예외를 사용하지 않고이 작업을 수행 할 수있는 방법이 있는지, 나는 어떻게하면 좋을지를 궁금해하고있었습니다.

+0

연결을 사용할 수 있는지 여부를 확인하는 기능을 사용할 수 없습니까? –

+1

obj.nil? - 루비 방법으로 객체를 확인합니다. – Fivell

답변

3

문제는 수표가 아니라 바로 그 일을하는 것입니다. 루비에서는 아무 것도 거짓이 아닌 것은 사실입니다. "sp = .."로 시작하는 행에서 예외가 발생하면 실행은 resque 블록으로 점프합니다. 이런 식으로 코드를 재구성해야한다 (나는 무엇을하는지 모르기 때문에 확실한 절을 제거했다). 그것이 행하는 좋은 예외는 모든 특정 유형의 예외를 구하는 것입니다. 클래스 이름으로 예. 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 개체 또는 SP 변수에 nil이 객체와 SP의 동일하거나 끝낼 것입니다 이런 식으로.

+1

'보장 '은 Java 나 C#에서'finally'와 같은 구조입니다. – Hauleth

+0

그래, 나도 알아. 나는이 절이 의미있는 바가 무엇인지 이해하지 못한다. 구조를 모두 예외로했다면, 시작/구조 전체에서 벗어날 수있다. 예외를 재현하거나 예외가 발생할 수있는 경우에만 필요합니다. 또한 "request_completed"는 무엇을합니까? 어떻게 네트워크 물건이 "siri_output"에 연결되어 있습니다. – sunkencity

+0

또한 DRY 방식이 아닙니다. – Hauleth

관련 문제