[Python-es] try - except no captura Traceback

Ricardo Cárdenes ricardo.cardenes en gmail.com
Mie Dic 12 11:18:31 CET 2012


Básicamente es eso. BaseHTTPServer lo ejecuta alguna clase derivada de
SocketServer, que está pensado para correr continuamente, así que
SocketServer._handle_request_noblock captura todas las excepciones no
tratadas más abajo y hace dos cosas en caso de que algo ocurra:

 - trata la excepción llamando a self.handle_error
 - da por terminada la petición llamando a self.shutdown_request

AMBAS se pueden reimplementar. La implementación base
(SocketServer.handle_error) sólo registra el error indicando la dirección
del cliente con el que estaba hablando y haciendo un traceback.print_exc().

De todas maneras, cuando se llama a handle_error ya es muy tarde para hacer
nada que no sea registrar el error y quizá liberar recursos, pero en
principio da igual, ya que estamos hablando de conexiones HTTP, que son
stateless...

2012/12/12 Marcos Sánchez Provencio <rapto en arrakis.es>

>  Este mensaje no ayudaba mucho...
>
> Creo que hay try/except más interno que gestiona esa excepción, sacando la
> información por pantalla, pero no tengo tiempo de mirarlo...
>
> El 12/12/12 08:55, Marcos Sánchez Provencio escribió:
>
> Puede ser simplemente que el cliente cancela la recepción... Otra cosa es
> que eso te tumbe el servidor.
>
> El 11/12/12 21:45, Jose Caballero escribió:
>
> Hola,
>
> python 2.6 en RHEL 6
>
> tengo un codigo como este [1].
> Esta dentro de un thread con la intencion de arrancar un servidor HTTP.
> Suele funcionar bien casi el 100% del tiempo.
> Sin embargo, de vez en cuando, me encuentro este Traceback en la consola
> [2]
> Evidentemente tengo que trabajarme un poco la logica del thread.
> Pero lo que me gustaria saber, y por eso pregunto aqui, es por que ese
> Traceback no es capturado por el bloque try - except  que contiene a
> self.httpd.serve_forever()
> No lo captura, y por tanto tampoco veo en los ficheros de logs el mensaje
> "HTTP Server threw exception:  [Errno 104] Connection reset by peer"
> Nota curiosa, si tengo en los logs otros mensajes, como "HTTP Server threw
> exception: [Errno 5] Input/output error", que vienen del mismo try - except.
> Por que ese try - except es capaz de capturar el Err 5, pero no el 104?
>
> Cualquier comentario y/o documentacion sobre esto sera mas que bienvenida.
>
> Saludos,
> Jose  (perdon por la ausencia de tildes)
>
>
> -----------------------------------------------------------------------------------------------------------------------------
>
> [1]
>
>
>     def _init_socketserver(self):
>         while not self.httpd:
>             try:
>                 self.log.debug("Attempting to bind to socket for HTTP
> server on port %s" % self.port)
>                 self.httpd = SocketServer.TCPServer(("", self.port),
> self.handler)
>                 self.log.info("Initialized HTTP SocketServer port=%d,
> root=%s, index = %s" % (self.port,
>
> self.docroot,
>
> self.index))
>             except Exception, e:
>                 self.log.warning("Socket server exception: %s" % str(e))
>                 self.log.warning("Attempt to initialize HTTP server
> failed. Will wait 60s and try again.")
>                 time.sleep(60)
>
>     def run(self):
>         self.log.info("Initializing HTTP server...")
>         self._init_socketserver()
>
>         os.chdir(self.docroot)
>         self.log.debug("Changing working dir to %s"%  self.docroot)
>         while not self.stopevent.isSet():
>             try:
>                 self.httpd.serve_forever()
>             except Exception, e:
>                 self.log.error("HTTP Server threw exception: %s" % str(e))
>
>
> -----------------------------------------------------------------------------------------------------------------------------
>
> [2]
>
>
> Traceback (most recent call last):
>   File "/usr/lib64/python2.6/SocketServer.py", line 283, in
> _handle_request_noblock
>     self.process_request(request, client_address)
>   File "/usr/lib64/python2.6/SocketServer.py", line 309, in process_request
>     self.finish_request(request, client_address)
>   File "/usr/lib64/python2.6/SocketServer.py", line 322, in finish_request
>     self.RequestHandlerClass(request, client_address, self)
>   File "/usr/lib64/python2.6/SocketServer.py", line 617, in __init__
>     self.handle()
>   File "/usr/lib64/python2.6/BaseHTTPServer.py", line 329, in handle
>     self.handle_one_request()
>   File "/usr/lib64/python2.6/BaseHTTPServer.py", line 323, in
> handle_one_request
>     method()
>   File "/usr/lib64/python2.6/SimpleHTTPServer.py", line 44, in do_GET
>     f = self.send_head()
>   File "/usr/lib64/python2.6/SimpleHTTPServer.py", line 81, in send_head
>     return self.list_directory(path)
>   File "/usr/lib64/python2.6/SimpleHTTPServer.py", line 134, in
> list_directory
>     self.send_response(200)
>   File "/usr/lib64/python2.6/BaseHTTPServer.py", line 382, in send_response
>     (self.protocol_version, code, message))
>   File "/usr/lib64/python2.6/socket.py", line 324, in write
>     self.flush()
>   File "/usr/lib64/python2.6/socket.py", line 303, in flush
>     self._sock.sendall(buffer(data, write_offset, buffer_size))
> error: [Errno 104] Connection reset by peer
>
>
>
>
>
> _______________________________________________
> Python-es mailing listPython-es en python.orghttp://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20121212/4fb4dc4c/attachment.html>


Más información sobre la lista de distribución Python-es