CommonClient.py UI: log full traceback
This commit is contained in:
		
							parent
							
								
									9508a9afc6
								
							
						
					
					
						commit
						8ff01ca979
					
				
							
								
								
									
										28
									
								
								kvui.py
								
								
								
								
							
							
						
						
									
										28
									
								
								kvui.py
								
								
								
								
							| 
						 | 
					@ -2,6 +2,7 @@ import os
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
import typing
 | 
					import typing
 | 
				
			||||||
import asyncio
 | 
					import asyncio
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
os.environ["KIVY_NO_CONSOLELOG"] = "1"
 | 
					os.environ["KIVY_NO_CONSOLELOG"] = "1"
 | 
				
			||||||
os.environ["KIVY_NO_FILELOG"] = "1"
 | 
					os.environ["KIVY_NO_FILELOG"] = "1"
 | 
				
			||||||
| 
						 | 
					@ -205,8 +206,25 @@ class GameManager(App):
 | 
				
			||||||
        self.commandprocessor("/help")
 | 
					        self.commandprocessor("/help")
 | 
				
			||||||
        Clock.schedule_interval(self.update_texts, 1 / 30)
 | 
					        Clock.schedule_interval(self.update_texts, 1 / 30)
 | 
				
			||||||
        self.container.add_widget(self.grid)
 | 
					        self.container.add_widget(self.grid)
 | 
				
			||||||
 | 
					        self.catch_unhandled_exceptions()
 | 
				
			||||||
        return self.container
 | 
					        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):
 | 
					    def update_texts(self, dt):
 | 
				
			||||||
        if self.ctx.server:
 | 
					        if self.ctx.server:
 | 
				
			||||||
            self.title = self.base_title + " " + Utils.__version__ + \
 | 
					            self.title = self.base_title + " " + Utils.__version__ + \
 | 
				
			||||||
| 
						 | 
					@ -287,7 +305,7 @@ class LogtoUI(logging.Handler):
 | 
				
			||||||
        self.on_log = on_log
 | 
					        self.on_log = on_log
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def handle(self, record: logging.LogRecord) -> None:
 | 
					    def handle(self, record: logging.LogRecord) -> None:
 | 
				
			||||||
        self.on_log(record)
 | 
					        self.on_log(self.format(record))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class UILog(RecycleView):
 | 
					class UILog(RecycleView):
 | 
				
			||||||
| 
						 | 
					@ -299,8 +317,8 @@ class UILog(RecycleView):
 | 
				
			||||||
        for logger in loggers_to_handle:
 | 
					        for logger in loggers_to_handle:
 | 
				
			||||||
            logger.addHandler(LogtoUI(self.on_log))
 | 
					            logger.addHandler(LogtoUI(self.on_log))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def on_log(self, record: logging.LogRecord) -> None:
 | 
					    def on_log(self, record: str) -> None:
 | 
				
			||||||
        self.data.append({"text": escape_markup(record.getMessage())})
 | 
					        self.data.append({"text": escape_markup(record)})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def on_message_markup(self, text):
 | 
					    def on_message_markup(self, text):
 | 
				
			||||||
        self.data.append({"text": text})
 | 
					        self.data.append({"text": text})
 | 
				
			||||||
| 
						 | 
					@ -310,8 +328,8 @@ class E(ExceptionHandler):
 | 
				
			||||||
    logger = logging.getLogger("Client")
 | 
					    logger = logging.getLogger("Client")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def handle_exception(self, inst):
 | 
					    def handle_exception(self, inst):
 | 
				
			||||||
        self.logger.exception(inst)
 | 
					        self.logger.exception("Uncaught Exception:", exc_info=inst)
 | 
				
			||||||
        return ExceptionManager.RAISE
 | 
					        return ExceptionManager.PASS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class KivyJSONtoTextParser(JSONtoTextParser):
 | 
					class KivyJSONtoTextParser(JSONtoTextParser):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue