2009-09-25 5 views
4

Je suis aller chercher des données météo d'un doc xml en ligne en utilisant Nokogiri, et je voudrais mettre en place un délai d'attente pour la récupération gracieuse au cas où la source ne peut pas être atteint ...read_timeout à Nokogiri?

Mes recherches Google montrent plusieurs méthodes possibles pour open-uri et Net :: HTTP, mais aucune spécifique à Nokogiri. Mes tentatives d'utiliser ces méthodes ne parviennent pas (pas trop surprenant):

begin 
currentloc = ("http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query=" + @destination.weatherloc) 
currentloc.read_timeout = 10 # 
doc = Nokogiri::XML(open(currentloc)) 
rescue Timeout::Error 
    return "Current weather for this location not available: request timed out." 
end 

retourne "NoMethodError", et:

begin 
currentloc = ("http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query=" + @destination.weatherloc) 
doc = Nokogiri::XML(open(currentloc), :read_timeout => 10) 
rescue Timeout::Error 
    return "Current weather for this location not available: request timed out." 
end 

retours "TypeError ne peut pas convertir Hash en chaîne"

Est-ce que Nokogiri soutient ce type de méthode (et si oui ... comment?), Ou devrais-je envisager une autre solution?

Merci.

Répondre

4

Vous pouvez utiliser le module de temporisation:

require 'open-uri' 
require 'nokogiri' 
require 'timeout' 

begin 
    timeout(10) do 
    result = Nokogiri::XML(open(currentloc)) 
    end 
rescue Timeout::Error 
    return "Current weahter..." 
end 
+0

Cela semble fonctionner (au moins il ne se brise pas), mais lorsque je tente de le tester en débranchant eth0, je suis obtenir un SocketError. Je suppose que j'ai besoin d'un test conditionnel pour ça aussi. L'ajout d'une instruction de secours supplémentaire (rescue SocketError) échoue cependant. Merci –

+0

Pouvez-vous poster votre code afin que je puisse voir par moi-même plus en détail? – Vincent