read python3 libreria from python

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.