From 8ff01ca9791969ce6142e3bff329e456c93bbd20 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Mon, 1 Nov 2021 06:40:29 +0100 Subject: [PATCH] CommonClient.py UI: log full traceback --- kvui.py | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/kvui.py b/kvui.py index f80b0011..c09bc59b 100644 --- a/kvui.py +++ b/kvui.py @@ -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):