python3 - python get https
¿Qué errores/excepciones debo manejar con urllib2.Request/urlopen? (5)
Añadir manejador de excepción genérico:
request = urllib2.Request(''http://www.example.com'', postBackData, { ''User-Agent'' : ''My User Agent'' })
try:
response = urllib2.urlopen(request)
except urllib2.HTTPError, e:
checksLogger.error(''HTTPError = '' + str(e.code))
except urllib2.URLError, e:
checksLogger.error(''URLError = '' + str(e.reason))
except httplib.HTTPException, e:
checksLogger.error(''HTTPException'')
except Exception:
import traceback
checksLogger.error(''generic exception: '' + traceback.format_exc())
Tengo el siguiente código para hacer una devolución de datos a una URL remota:
request = urllib2.Request(''http://www.example.com'', postBackData, { ''User-Agent'' : ''My User Agent'' })
try:
response = urllib2.urlopen(request)
except urllib2.HTTPError, e:
checksLogger.error(''HTTPError = '' + str(e.code))
except urllib2.URLError, e:
checksLogger.error(''URLError = '' + str(e.reason))
except httplib.HTTPException, e:
checksLogger.error(''HTTPException'')
El postBackData se crea usando un diccionario codificado usando urllib.urlencode. checksLogger es un registrador que usa el logging .
Tuve un problema donde este código se ejecuta cuando el servidor remoto está inactivo y el código sale (esto está en los servidores del cliente, así que no sé cuál es el volcado / error de la pila de salida en este momento). Estoy asumiendo que esto se debe a que hay una excepción y / o error que no se está manejando. Entonces, ¿hay alguna otra excepción que pueda desencadenarse que no estoy manejando arriba?
Desde la entrada de urlopen
página de documentos , parece que solo necesita capturar URLError . Si realmente desea cubrir sus apuestas contra los problemas dentro del código urllib, también puede detectar Exception
como un retroceso. No solo except:
ya que eso atrapará también a SystemExit
y KeyboardInterrupt
.
Editar: Lo que quiero decir es que estás atrapando los errores que se supone que arroja. Si está arrojando algo más, probablemente se debe a que el código urllib no detecta algo que debería haber capturado y envuelto en un URLError
. Incluso el stdlib tiende a perder cosas simples como AttributeError
. La Exception
captura como un retroceso (y el registro de lo capturado) te ayudará a descubrir lo que está sucediendo, sin atrapar SystemExit
y KeyboardInterrupt
.
Puede capturar todas las excepciones y registrar lo que se atrapó:
import sys
import traceback
def formatExceptionInfo(maxTBlevel=5):
cla, exc, trbk = sys.exc_info()
excName = cla.__name__
try:
excArgs = exc.__dict__["args"]
except KeyError:
excArgs = "<no args>"
excTb = traceback.format_tb(trbk, maxTBlevel)
return (excName, excArgs, excTb)
try:
x = x + 1
except:
print formatExceptionInfo()
(Código de http://www.linuxjournal.com/article/5821 )
Lea también la documentación en sys.exc_info .
Yo agarro:
httplib.HTTPException
urllib2.HTTPError
urllib2.URLError
Creo que esto cubre todo, incluidos los errores de socket.
$ grep "raise" /usr/lib64/python/urllib2.py
IOError); for HTTP errors, raises an HTTPError, which can also be
raise AttributeError, attr
raise ValueError, "unknown url type: %s" % self.__original
# XXX raise an exception if no one else should try to handle
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
perform the redirect. Otherwise, raise HTTPError if no-one
raise HTTPError(req.get_full_url(), code, msg, headers, fp)
raise HTTPError(req.get_full_url(), code,
raise HTTPError(req.get_full_url(), 401, "digest auth failed",
raise ValueError("AbstractDigestAuthHandler doesn''t know "
raise URLError(''no host given'')
raise URLError(''no host given'')
raise URLError(err)
raise URLError(''unknown url type: %s'' % type)
raise URLError(''file not on local host'')
raise IOError, (''ftp error'', ''no host given'')
raise URLError(msg)
raise IOError, (''ftp error'', msg), sys.exc_info()[2]
raise GopherError(''no host given'')
También existe la posibilidad de excepciones en dependencias urllib2, o de excepciones causadas por errores genuinos.
Lo mejor es que registre todas las excepciones no detectadas en un archivo a través de un sys.excepthook personalizado. La regla principal aquí es nunca capturar las excepciones que no está planeando corregir , y el registro no es una corrección . Así que no los atrape solo para registrarlos.