2013-12-20 2 views
0

Я использую Mechanize в Ruby для отправки форм на сайт для получения данных. Иногда я получу ошибку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 

Это приведет к краху сервера. Я хотел бы поймать эту ошибку и обработать ее (повторив позже).

Я попытался

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

Но это не поймать ошибку. Что мне не хватает?

Спасибо.

+0

Попробуйте поставить еще одну спасательную Exception => е –

ответ

0

Похоже, что Mechanize поймал ошибку Errno::ETIMEDOUT и выбросил новое исключение, содержащее сообщение об ошибке. Следовательно, имя класса исключения отличается и не может быть уловлено с Errno::ETIMEDOUT.

Чтобы определить тип ошибки, попробуйте следующее:

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

Это даст вам имя класса исключения, и вы можете обновить условие спасения.

+0

это не будет уловить все исключения, но только те, которые унаследованы от «StandardError». лучше использовать 'rescue Exception => e' –

+0

@NafaaBoutefer считается ошибочной практикой ловить' Exception', потому что он нарушает определенное поведение (например, сигналы, Ctrl-C и т. д.) и может привести к продолжению работы вашей программы, когда есть хорошие причины, почему это должно прекратиться. Если есть конкретное исключение, которое вам нужно поймать, которое не наследуется от 'StandardError', лучше всего указать его напрямую. –

+0

да, это так. поэтому вы можете просто повысить исключение, если это сигнал. 'raise e if e.is_a? (Interrupt)' –

0

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

Так что, если вы читаете источник Net-Http-стойких >here<, вы увидите, что ошибка, которую вы должны поймать это:

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

Не работает ли это? –