La manipulation erreur de dépassement de Délai
Après l'utilisation de délai d'attente:
status = Timeout::timeout(5) {
# Something that should be interrupted if it takes too much time...
}
J'ai eu cette erreur de dépassement de Délai:
/Users/galharth/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:644:in `initialize': execution expired (Timeout::Error)
from /Users/galharth/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:644:in `open'
from /Users/galharth/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:644:in `block in connect'
from /Users/galharth/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/timeout.rb:44:in `timeout'
from /Users/galharth/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/timeout.rb:87:in `timeout'
from /Users/galharth/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:644:in `connect'
from /Users/galharth/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:637:in `do_start'
from /Users/galharth/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:632:in `start'
from /Users/galharth/.rvm/gems/ruby-1.9.2-p136/gems/mechanize-1.0.0/lib/mechanize.rb:527:in `fetch_page'
from /Users/galharth/.rvm/gems/ruby-1.9.2-p136/gems/mechanize-1.0.0/lib/mechanize.rb:259:in `get'
Que dois-je faire?
status = Timeout::timeout(5) { puts "ok" }
Échoué?Je viens de le tester sur ruby1-9-2-p180 - pas de problème
Mon instinct me dit que vous devriez faire un effort pour éviter le délai d'attente de se produire, si possible. Pouvez-vous partager cette requête unique en plusieurs petites requêtes?
Vous ne pouvez pas contrôler le comportement de l'internet. Une demande pour une petite page peut prendre quelques minutes. Il n'a rien à voir avec le nombre de demandes, c'est la réceptivité de l'hôte retour de la demande.
Que tout dépend de la raison de la lenteur du temps de réponse. Si l'appel d'API est lent parce que c'est le retour d'un grand nombre de données, vous pourriez probablement briser cet appel en de nombreux petits appels. Donc, non, vous n'êtes pas toujours à l'instigation de l'Internet.
OriginalL'auteur gal | 2011-04-07
Vous devez vous connecter pour publier un commentaire.
Eh bien, c'est un comportement attendu de
Timeout
. Si le bloc est trop long, son exécution devient fin et une exception.Vous auriez probablement comme pour attraper l'exception et gérer de manière appropriée:
Timeout
commune exception estTimeout::Error
. C'est un autre problèmeUn sauvetage de bloquer la poignée Délai d'attente::Erreur?
une opération de sauvetage de bloquer la poignée Délai d'attente::Erreur?" À partir de la Délai d'attente de la documentation:
If the block execution terminates before sec seconds has passed, it returns the result value of the block. If not, it terminates the execution and raises exception (which defaults to Timeout::Error).
Je reconnais qu'il déclenche une "exception", mais son type est "Interrompre", n'est-il pas? Autant que je sache, une opération de sauvetage de bloquer uniquement les captures StandardError et de ses sous-types.
En effet, vous pouvez
rescue
.Timeout::Error.ancestors
donneTimeout::Error
RuntimeError
StandardError
Exception
Object
Kernel
BasicObject
OriginalL'auteur Mladen Jablanović
OriginalL'auteur vikas pal