2013-12-20 2 views
0

Ruby에서 Mechanize를 사용하여 양식을 사이트에 게시하여 데이터를 가져옵니다. 경우에 따라 오류가 발생합니다.ruby ​​catch connection timeout error

too many connection resets (due to Operation timed out - Errno::ETIMEDOUT) after 13 requests on 34234234234242, last used 20.518373 seconds ago 

이렇게하면 서버가 중단됩니다. 이 오류를 catch하고 나중에 다시 시도하여 처리하고 싶습니다.

나는
begin 
    postForm(form) 
    rescue Errno::ETIMEDOUT 
    puts "=====>TimeOut ERROR!:" 
    end 

을 시도하지만 오류를 잡기되지 않습니다. 내가 무엇이 누락 되었습니까?

감사합니다.

+0

시도는 또 하나 개의 구조 예외를 두는 => 전자 –

답변

0

기계화가 Errno::ETIMEDOUT 오류를 발견하여 오류 메시지가 포함 된 새로운 예외가 발생했습니다. 따라서 예외 클래스 이름은 달라서 Errno::ETIMEDOUT을 사용하여 catch 할 수 없습니다. 당신에게 예외 클래스 이름을 줄 것이다

begin 
    postForm(form) 
rescue => e 
    puts e.class 
end 

을, 당신은 구조 절을 업데이트 할 수 있습니다

오류의 유형을 확인하려면 다음을 시도하십시오.

+0

이하지 않습니다 모든 예외를 잡아라. 그러나 'StandardError'를 상속받은 것들만 예외이다. 'Rescue Exception => e'를 사용하는 것이 낫다. –

+0

@NafaaBoutefer 어떤 행동 (예 : 신호, Ctrl-C 등)을 깨기 때문에 'Exception'을 잡는 것이 나쁜 습관으로 간주되며 프로그램이있을 때 실행을 계속할 수있다. 왜 멈추어야하는지에 대한 좋은 이유. 'StandardError'를 상속받지 않는 특별한 예외가 있다면 직접 지정하는 것이 가장 좋습니다. –

+0

예, 맞습니다. 그래서 신호이면 다시 예외를 발생시킬 수 있습니다. 'e.is_a라면 e raise (인터럽트) ' –

0

전체 오류 메시지를 읽는다면 '연결 재설정 횟수가 너무 많아서 실패했습니다.'라는 메시지가 나타납니다. 연결 시간이 초과되면 연결이 13 회 재설정되고 이미 복구 된 것입니다.

당신이 인터넷 - HTTP를 지속 >here<의 소스를 읽을 그렇다면, 당신은 당신이 잡을 필요가 오류가 있음을 볼 수 있습니다 :

Net::HTTP::Persistent::Error 
+0

작동하지 않습니까? –