2011-06-14 27 views
7

Tengo un código de rubí como esto:Ruby - Ejecución expirado

begin 
    doc = Nokogiri::HTML(open(url).read.strip) 
rescue Exception => ex 
    log.error "Error: #{ex}" 
end 

Y yo estoy recibiendo de registro como:

ERROR -- : Error: execution expired 

quiero bloquear volver a ejecutar hasta que el éxito.

¿Cómo puedo hacerlo?

+0

En primer lugar tratar de abrir la url separetly pase en nokogiri, pues esto podría permitir bugfixing más fácil –

+0

Quieres decir esto ?: 'doc = open (url) .read.strip Doc = Nokogiri :: HTML (doc) ' – Sayuj

+0

No, quiero decir' data = open (url) .read.strip' luego en la siguiente línea 'doc = Nokogiri :: HTML (data)' –

Respuesta

24

Expandiré mi comentario un poco. Puede utilizar retry a volver a la begin:

begin 
    doc = Nokogiri::HTML(open(url).read.strip) 
rescue Exception => ex 
    log.error "Error: #{ex}" 
    retry 
end 

Que a seguir tratando (y errores de registro) hasta que funcione o se matan manualmente. Sin embargo, eso probablemente no es lo que quieres, ya que un pequeño error te enviará a un ciclo infinito. Una forma fácil de solucionar que es dejar que se trate para, por ejemplo, 10 veces y luego se dio por vencido:

MAX_ATTEMPTS = 10 

doc = nil 
begin 
    doc = Nokogiri::HTML(open(url).read.strip) 
rescue Exception => ex 
    log.error "Error: #{ex}" 
    attempts = attempts + 1 
    retry if(attempts < MAX_ATTEMPTS) 
end 

if(doc.nil?) 
    # Do something about the persistent error 
    # so that you don't try to access a nil 
    # doc later on. 
end 

Algo como esto va a probar un par de veces y luego abandonar. También puede poner una llamada sleep antes del retry si desea esperar un poco antes del próximo intento o investigar la excepción (posiblemente con múltiples bloques rescue) para elegir si debe abandonar inmediatamente, esperar y volver a intentar, o volver a intentar inmediatamente.

Cuestiones relacionadas