CommonClient.py UI: log full traceback

This commit is contained in:
Fabian Dill 2021-11-01 06:40:29 +01:00
parent 9508a9afc6
commit 8ff01ca979
1 changed files with 23 additions and 5 deletions

28
kvui.py
View File

@ -2,6 +2,7 @@ import os
import logging
import typing
import asyncio
import sys
os.environ["KIVY_NO_CONSOLELOG"] = "1"
os.environ["KIVY_NO_FILELOG"] = "1"
@ -205,8 +206,25 @@ class GameManager(App):
self.commandprocessor("/help")
Clock.schedule_interval(self.update_texts, 1 / 30)
self.container.add_widget(self.grid)
self.catch_unhandled_exceptions()
return self.container
def catch_unhandled_exceptions(self):
"""Relay unhandled exceptions to UI logger."""
if not getattr(sys.excepthook, "_wrapped", False): # skip if already modified
orig_hook = sys.excepthook
def handle_exception(exc_type, exc_value, exc_traceback):
if issubclass(exc_type, KeyboardInterrupt):
sys.__excepthook__(exc_type, exc_value, exc_traceback)
return
logging.getLogger("Client").exception("Uncaught exception",
exc_info=(exc_type, exc_value, exc_traceback))
return orig_hook(exc_type, exc_value, exc_traceback)
handle_exception._wrapped = True
sys.excepthook = handle_exception
def update_texts(self, dt):
if self.ctx.server:
self.title = self.base_title + " " + Utils.__version__ + \
@ -287,7 +305,7 @@ class LogtoUI(logging.Handler):
self.on_log = on_log
def handle(self, record: logging.LogRecord) -> None:
self.on_log(record)
self.on_log(self.format(record))
class UILog(RecycleView):
@ -299,8 +317,8 @@ class UILog(RecycleView):
for logger in loggers_to_handle:
logger.addHandler(LogtoUI(self.on_log))
def on_log(self, record: logging.LogRecord) -> None:
self.data.append({"text": escape_markup(record.getMessage())})
def on_log(self, record: str) -> None:
self.data.append({"text": escape_markup(record)})
def on_message_markup(self, text):
self.data.append({"text": text})
@ -310,8 +328,8 @@ class E(ExceptionHandler):
logger = logging.getLogger("Client")
def handle_exception(self, inst):
self.logger.exception(inst)
return ExceptionManager.RAISE
self.logger.exception("Uncaught Exception:", exc_info=inst)
return ExceptionManager.PASS
class KivyJSONtoTextParser(JSONtoTextParser):