J'utilise Rails 4.2.3 et Nokogiri pour obtenir des données d'un site Web. Je veux effectuer une action quand je ne reçois pas de réponse du serveur, donc je dois:Dans RoR, comment puis-je intercepter une exception si je n'obtiens aucune réponse d'un serveur?
begin
content = open(url).read
if content.lstrip[0] == '<'
doc = Nokogiri::HTML(content)
else
begin
json = JSON.parse(content)
rescue JSON::ParserError => e
content
end
end
rescue Net::OpenTimeout => e
attempts = attempts + 1
if attempts <= max_attempts
sleep(3)
retry
end
end
Notez que ceci est différent que d'obtenir 500 à partir du serveur. Je veux seulement réessayer quand je n'obtiens aucune réponse, soit parce que je n'obtiens aucune connexion de TCP ou parce que le serveur ne répond pas (ou n'importe quelle autre raison qui m'empêche d'obtenir n'importe quelle réponse). Existe-t-il une façon plus générique de prendre en compte cette situation autrement que comme je l'ai? J'ai l'impression qu'il y a beaucoup d'autres types d'exceptions auxquels je ne pense pas.
Vous n'êtes pas en utilisant Nokogiri pour obtenir des données, vous l'utilisez pour _parse_ data. OpenURI "obtient" les données. C'est une distinction importante qui supprime Nokogiri de la question. En outre, le titre est trompeur; Rails est un framework écrit en Ruby. Vous n'écrivez pas de choses dans Rails, vous les écrivez en Ruby, et parfois utilisez les méthodes de Rails. Je suggère de reformuler la question en fonction de cette connaissance. Il y a beaucoup d'erreurs HTTP définies que vous pouvez gérer, et il peut y avoir des erreurs personnalisées définies par les administrateurs d'un site, donc vous devez en être conscient. –
Je ne me soucie pas des messages personnalisés définis par un site - ce qui impliquerait qu'une réponse est renvoyée. J'essaie de rendre compte de la situation (et seulement la situation) où je n'obtiens aucune réponse du tout?Est-ce clair ce que je demande - n'obtenant aucune réponse par rapport à l'obtention de réponses indiquant d'autres conditions? – Dave
Vous ne souhaitez pas obtenir de connexion TCP ou obtenir une connexion TCP, mais le serveur ne répond pas. –