Просмотр исходного кода

WebSocket.receive_forever() now handles exceptions without crashing

Taddeus Kroes 13 лет назад
Родитель
Сommit
0991900692
2 измененных файлов с 16 добавлено и 4 удалено
  1. 3 0
      server.py
  2. 13 4
      websocket.py

+ 3 - 0
server.py

@@ -87,6 +87,9 @@ class Client(WebSocket):
     def onclose(self, code, reason):
     def onclose(self, code, reason):
         self.server.remove_client(self, code, reason)
         self.server.remove_client(self, code, reason)
 
 
+    def onexception(self, e):
+        logging.error(format_exc(e))
+
     def __str__(self):
     def __str__(self):
         return '<Client at %s:%d>' % self.address
         return '<Client at %s:%d>' % self.address
 
 

+ 13 - 4
websocket.py

@@ -128,15 +128,18 @@ class WebSocket(object):
         of multiple data frames, but this is not visible for onmessage().
         of multiple data frames, but this is not visible for onmessage().
         Control messages (or control frames) are handled automatically.
         Control messages (or control frames) are handled automatically.
         """
         """
-        try:
-            while True:
+        while True:
+            try:
                 self.onmessage(self, self.receive_message())
                 self.onmessage(self, self.receive_message())
 
 
                 if self.received_close_params is not None:
                 if self.received_close_params is not None:
                     self.handle_close(*self.received_close_params)
                     self.handle_close(*self.received_close_params)
                     break
                     break
-        except SocketClosed:
-            self.onclose(None, '')
+            except SocketClosed:
+                self.onclose(None, '')
+                break
+            except Exception as e:
+                self.onexception(e)
 
 
     def run_threaded(self, daemon=True):
     def run_threaded(self, daemon=True):
         """
         """
@@ -221,3 +224,9 @@ class WebSocket(object):
         Called when the socket is closed by either end point.
         Called when the socket is closed by either end point.
         """
         """
         pass
         pass
+
+    def onexception(self, e):
+        """
+        Handle a raised exception.
+        """
+        pass