Python BaseHTTPServer, wie fange ich/trap "broken pipe" Fehler?
Baue ich einen kurz-url-übersetzer-engine in Python, und ich bin zu sehen eine TONNE "broken pipe" Fehler, und ich bin neugierig, wie trap es am besten, wenn Sie mit dem BaseHTTPServer-Klassen. Dies ist nicht der gesamte code, aber gibt Ihnen eine Vorstellung von dem, was ich mache so weit:
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import memcache
class clientThread(BaseHTTPRequestHandler):
def do_GET(self):
content = None
http_code,response_txt,long_url = \
self.ag_trans_url(self.path,content,'GET')
self.http_output( http_code, response_txt, long_url )
return
def http_output(self,http_code,response_txt,long_url):
self.send_response(http_code)
self.send_header('Content-type','text/plain')
if long_url:
self.send_header('Location', long_url)
self.end_headers()
if response_txt:
self.wfile.write(response_txt)
return
def ag_trans_url(self, orig_short_url, post_action, getpost):
short_url = 'http://foo.co' + orig_short_url
# fetch it from memcache
long_url = mc.get(short_url)
# other magic happens to look it up from db if there was nothing
# in memcache, etc
return (302, None, log_url)
def populate_memcache()
# connect to db, do lots of mc.set() calls
def main():
populate_memcache()
try:
port = 8001
if len(sys.argv) > 1:
port = int(sys.argv[1])
server = HTTPServer(('',port), clientThread)
#server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
print '[',str(datetime.datetime.now()),'] short url processing has begun'
server.serve_forever()
except KeyboardInterrupt,SystemExit:
print '^C received, shutting down server'
server.socket.close()
Den code selbst funktioniert Super, aber fing an zu werfen Fehler fast sofort auf, wenn in der Produktion:
Traceback (most recent call last):
File "/usr/lib/python2.5/SocketServer.py", line 222, in handle_request
self.process_request(request, client_address)
File "/usr/lib/python2.5/SocketServer.py", line 241, in process_request
self.finish_request(request, client_address)
File "/usr/lib/python2.5/SocketServer.py", line 254, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/lib/python2.5/SocketServer.py", line 522, in __init__
self.handle()
File "/usr/lib/python2.5/BaseHTTPServer.py", line 316, in handle
self.handle_one_request()
File "/usr/lib/python2.5/BaseHTTPServer.py", line 310, in handle_one_request
method()
File "/opt/short_url_redirector/shorturl.py", line 38, in do_GET
self.http_output( http_code, response_txt, long_url )
File "/opt/short_url_redirector/shorturl.py", line 52, in http_output
self.send_response(http_code)
File "/usr/lib/python2.5/BaseHTTPServer.py", line 370, in send_response
self.send_header('Server', self.version_string())
File "/usr/lib/python2.5/BaseHTTPServer.py", line 376, in send_header
self.wfile.write("%s: %s\r\n" % (keyword, value))
File "/usr/lib/python2.5/socket.py", line 274, in write
self.flush()
File "/usr/lib/python2.5/socket.py", line 261, in flush
self._sock.sendall(buffer)
error: (32, 'Broken pipe')
Den Großteil dieser Fehler scheint stem von einem problem beim Aufruf der send_header () - Methode, wo ich nicht schreiben kann, ist dies:
self.send_header('Location', long_url)
So, ich bin gespannt, wo in meinen code, um zu versuchen, um eine Falle für das IO exception... Schreibe ich try/außer Anrufe um jeden selbst.send_header/selbst.end_headers/selbst.wfile.schreiben fordert? Die anderen Fehler sehe ich von Zeit zu Zeit ist das eine, aber sicher nicht die Ausnahme zu beobachten, sogar zu fangen:
Traceback (most recent call last):
File "/usr/lib/python2.5/SocketServer.py", line 222, in handle_request
self.process_request(request, client_address)
File "/usr/lib/python2.5/SocketServer.py", line 241, in process_request
self.finish_request(request, client_address)
File "/usr/lib/python2.5/SocketServer.py", line 254, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/lib/python2.5/SocketServer.py", line 522, in __init__
self.handle()
File "/usr/lib/python2.5/BaseHTTPServer.py", line 316, in handle
self.handle_one_request()
File "/usr/lib/python2.5/BaseHTTPServer.py", line 299, in handle_one_request
self.raw_requestline = self.rfile.readline()
File "/usr/lib/python2.5/socket.py", line 381, in readline
data = self._sock.recv(self._rbufsize)
error: (104, 'Connection reset by peer')
InformationsquelleAutor iandouglas | 2011-05-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den "broken pipe" - exception bedeutet, dass Ihr code zu schreiben versucht, zu a-Buchse/Rohr, das am anderen Ende geschlossen. Wenn das andere Ende ist ein web-browser, der Benutzer gestoppt haben könnte, den Antrag. Können Sie ignorieren die traceback; es bedeutet nicht, dass ein ernstes problem. Wenn Sie möchten, um die Meldung zu unterdrücken, können Sie einen try ... except-block, um den code in Ihre http_output Funktion und protokollieren die Ausnahme, wenn Sie möchten.
Darüber hinaus, wenn Sie wollen, dass Ihr HTTP-server zum verarbeiten mehr als eine Anforderung zu einer Zeit, müssen Sie Ihre server-Klasse, verwenden Sie eine der SocketServer.ForkingMixIn und SocketServer.ThreadingMixIn Klassen. Überprüfen Sie die Dokumentation des SocketServer Moduls für details.
Hinzufügen: Die "connection reset by peer" Ausnahme bedeutet, dass Ihr code versucht zu Lesen, von einem Toten sockel. Wenn Sie möchten, zu unterdrücken, wird die traceback -, werden Sie brauchen, um erweitern die BaseHTTPServer-Klasse und überschreiben Sie die handle_one_request Methode zum hinzufügen einer try ... except-block. Benötigen Sie eine neue server-Klasse sowieso zu implementieren, die den früheren Vorschlag, über die Verarbeitung mehr als eine Anforderung zu einem Zeitpunkt.
Die Funktionen im socket-Modul erhöhen Buchse.Fehler. Ab python 2.6, Buchse.Fehler ist eine Unterklasse von IOError (Dokumentation der socket-Modul). Da Sie gezielt 2.5 (ausgehend von den Dateinamen in Ihren traceback), müssen Sie zu fangen-Buchse.Fehler.
InformationsquelleAutor Kushal Kumaran
Dies scheint ein bug in der SocketServer, finden Sie unter diesem link Python-Fehler: 14574
Einen fix (der funktioniert bei mir in Python 2.7) ist das überschreiben der SocketServer.StreamRequestHandler finish () - Methode, so etwas wie dieses:
Meine Lösung ist ähnlich wie deine, aber in der
handle()
MethodeInformationsquelleAutor Jason Morgan
In meiner Anwendung, die den Fehler gar nicht auftreten, in
finish()
, kam es inhandle()
. Dieses Update fängt diebroken pipe
Fehler:InformationsquelleAutor Brent Washburne