Manejo de excepciones de urllib2 y mecanización en Python

Soy un principiante en el uso de manejo de excepciones. Estoy utilizando el módulo mecanizar para raspar varios sitios web. Mi progtwig falla con frecuencia porque la conexión es lenta y porque las solicitudes se agotan. Me gustaría poder reintentar el sitio web (en un tiempo de espera, por ejemplo) hasta 5 veces después de 30 segundos de retraso entre cada bash.

Miré esta respuesta de stackoverflow y puedo ver cómo puedo manejar varias excepciones. También veo (aunque parece muy torpe) cómo puedo poner el try / excepción dentro de un bucle while para controlar los 5 bashs … pero no entiendo cómo salir del bucle, o “continuar” cuando la conexión Tiene éxito y no se ha lanzado ninguna excepción.

from mechanize import Browser import time b = Browser() tried=0 while tried  4: exit() else: print e.reason.args tried += 1 sleep(30) if tried > 4: exit() print "How can I get to here after the first successful b.open() attempt????" 

Apreciaría consejos sobre (1) cómo salir del circuito en una apertura exitosa y (2) cómo hacer que todo el bloque sea menos torpe / más elegante.

No tienes que repetir las cosas en el bloque de excepción que haces en cualquier caso.

 from mechanize import Browser import time b = Browser() tried=0 while True: try: r=b.open('http://www.google.com/foobar') except (mechanize.HTTPError,mechanize.URLError) as e: tried += 1 if isinstance(e,mechanize.HTTPError): print e.code else: print e.reason.args if tried > 4: exit() sleep(30) continue break 

Además, es posible que pueda usar while not r: dependiendo de lo que Browser.open devuelva.

Edit: roadierich mostró una forma más elegante con

 try: doSomething() break except: ... 

Porque un error salta al bloque excepto.

Su primera pregunta se puede hacer con break :

 while tried < 5: try: r=b.open('http://www.google.com/foobar') break except #etc... 

La verdadera pregunta, sin embargo, es si realmente quieres: esto es lo que se conoce como "código de espagueti": si intentas graficar la ejecución a través del progtwig, parece un plato de espagueti.

El problema real (imho) que está teniendo, es que su lógica para salir del bucle while es defectuosa. En lugar de intentar detenerse después de varios bashs (una condición que nunca ocurre porque ya está saliendo de todos modos), realice un bucle hasta que tenga una conexión:

 #imports etc tried=0 connected = False while not Connected: try: r = b.open('http://www.google.com/foobar') connected = true # if line above fails, this is never executed except mechanize.HTTPError as e: print e.code tried += 1 if tried > 4: exit() sleep(30) except mechanize.URLError as e: print e.reason.args tried += 1 if tried > 4: exit() sleep(30) #Do stuff 

Para su primera pregunta, simplemente desea la palabra clave “break”, que se sale de un bucle.

Para la segunda pregunta, puede tener varias cláusulas “excepto” para un “bash”, para diferentes tipos de excepciones. Esto reemplaza su comprobación de instancia () y hará que su código sea más limpio.