|
@@ -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):
|
|
|
"""
|