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 <ra...@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@python.orghttp://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > > > _______________________________________________ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > >
_______________________________________________ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/