2010-04-26 12 views
53

Estoy usando el parámetro de tiempo de espera dentro de urloib2's urlopen.¿Cómo manejar el tiempo de espera de urllib2? - Python

urllib2.urlopen('http://www.example.org', timeout=1) 

¿Cómo le digo a Python que si el tiempo de espera expira, se debe generar un error personalizado?


¿Alguna idea?

+1

Nota: El parámetro ['timeout' no limita ni el tiempo de conexión * total * ni el tiempo de lectura (respuesta) * total *. (Http://stackoverflow.com/a/32684677/4279) – jfs

Respuesta

87

Hay muy pocos casos en los que desee utilizar except:. Hacer esto capta cualquier excepción, que puede ser difícil de depurar y Captura excepciones incluyendo SystemExitKeyboardInterupt y, lo que puede hacer que su programa molesto para usar ..

En el más simple, podría coger urllib2.URLError:

try: 
    urllib2.urlopen("http://example.com", timeout = 1) 
except urllib2.URLError, e: 
    raise MyException("There was an error: %r" % e) 

lo que sigue debe capturar el error específico que plantean cuando los tiempos de espera de la conexión:

import urllib2 
import socket 

class MyException(Exception): 
    pass 

try: 
    urllib2.urlopen("http://example.com", timeout = 1) 
except urllib2.URLError, e: 
    # For Python 2.6 
    if isinstance(e.reason, socket.timeout): 
     raise MyException("There was an error: %r" % e) 
    else: 
     # reraise the original error 
     raise 
except socket.timeout, e: 
    # For Python 2.7 
    raise MyException("There was an error: %r" % e) 
+5

Esto no funcionará en Python 2.7, ya que URLError no detecta socket.timeout más –

+0

@TalWeiss gracias, agregó una captura adicional para 'socket.timeout' – dbr

+1

En cuanto a Python 2.7.5, los tiempos de espera se detectan mediante urllib2.URLError. –

15

En Python 2.7.3:

import urllib2 
import socket 

class MyException(Exception): 
    pass 

try: 
    urllib2.urlopen("http://example.com", timeout = 1) 
except urllib2.URLError as e: 
    print type(e) #not catch 
except socket.timeout as e: 
    print type(e) #catched 
    raise MyException("There was an error: %r" % e) 
Cuestiones relacionadas