Browse Source

better implementation of an error handler

digital 7 years ago
parent
commit
8a81ffd6a9
1 changed files with 45 additions and 23 deletions
  1. 45 23
      network/__init__.py

+ 45 - 23
network/__init__.py

@@ -37,19 +37,39 @@ lserver = logging.getLogger(__name__+".server")
 lch = logging.getLogger(__name__+".chandler")
 lschat = logging.getLogger(__name__+".server.chat")
 lcchat = logging.getLogger(__name__+".client.chat")
+lerr = logging.getLogger(__name__+".errhandler")
 
-def error_handler(
-        func,args=(),kwargs={},logger=None,log_text="error",async_=False):
-    if not logger:
-        raise TypeError(
-            "No logger specified but this error handler needs one!")
-    try:
-        if async_
-            curio.run(func(*args,**kwargs))
-        else:
+
+class ErrorHandler(object):
+    """
+    This Class provides a easy way to execute a function which is likely to
+    raise an exception and log the traceback.
+    """
+    def __init__(self,logger):
+        super().__init__()
+        self.logger = logger
+
+    def run(func,args=(),kwargs={},text=None,logger=None):
+        if not logger:
+            logger = self.logger
+        if not text:
+            print("ErrorHandler:WARNING:no text specified,"
+                " this is highly discouraged")
+        try:
             func(*args,**kwargs)
-    except Exception as exc:
-        logger.debug("error occured during "+log_text,exc_info=exc)
+        except Exception as exc:
+            logger.debug("error occured during "+text,exc_info=exc)
+
+    async def arun(func,args=(),kwargs={},text=None,logger=None):
+        if not logger:
+            logger = self.logger
+        if not text:
+            print("ErrorHandler:WARNING:no text specified,"
+                " this is highly discouraged")
+        try:
+            await func(*args,**kwargs)
+        except Exception as exc:
+            logger.debug("error occured during "+text,exc_info=exc)
 
 
 class ConnHandlerBase(object):
@@ -224,13 +244,13 @@ class Server(object):
     # fatal exception
     exit_event = False
     def __init__(self,
-            host,
-            port,
-            handler_class,
-            handler_kwargs={},
-            af_family="AF_INET",
-            log_ip=False,
-            max_allowed_clients=5,
+                host,
+                port,
+                handler_class,
+                handler_kwargs={},
+                af_family="AF_INET",
+                log_ip=False,
+                max_allowed_clients=5,
             ):
         super(Server, self).__init__()
         self.host = host
@@ -240,6 +260,8 @@ class Server(object):
         self.af_family = af_family
         self.log_ip = log_ip
         self.max_allowed_clients = max_allowed_clients
+        # the error handler used by, for instance server.shutdown
+        self.safe_handle = ErrorHandler(lserver)
         # don't make the socket yet, we don't need right now. will be created
         # when the start method is called
         self.socket = None
@@ -304,8 +326,8 @@ class Server(object):
         """
         atexit.unregister(self.shutdown)
         lserver.info("shutting down server")
-        await error_handler(self.handle_tasks.cancel_remaining,
-            log_text="handler cancel",async_=True)
+        await self.safe_handle.arun(
+            self.handle_tasks.cancel_remaining,text="handler cancel")
         try:
             await curio.ignore_after(0.01,self.handle_tasks.join)
         except Exception as exc:
@@ -313,9 +335,9 @@ class Server(object):
         # check if there is actually a socket. if the shutdown method is
         # executed before the start method, there is no socket.
         if self.socket:
-            await error_handler(self.socket.shutdown,socket.SHUT_RDWR,
-                log_text="socket shutdown")
-            await error_handler(self.socket.close,log_text="socket close")
+            await self.safe_handle.arun(self.socket.shutdown,
+                args=[socket.SHUT_RDWR,],text="socket shutdown")
+            await self.safe_handle.arun(self.socket.close,text="socket close")
 
     def start(self):
         """