From aece5340e05a19d0036d8e5d573996d05f185b4e Mon Sep 17 00:00:00 2001 From: Tyler Fox Date: Sun, 22 Feb 2026 00:47:16 -0800 Subject: [PATCH 1/2] Add try/except around all plugin loads --- preditor/plugins.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/preditor/plugins.py b/preditor/plugins.py index 4ebf513e..d4ab56ea 100644 --- a/preditor/plugins.py +++ b/preditor/plugins.py @@ -70,7 +70,10 @@ def add_logging_handler(self, logger, handler_cls, *args, **kwargs): def editor(self, name): for plug_name, ep in self.editors(name): - return plug_name, ep.load() + try: + return plug_name, ep.load() + except Exception: + _logger.warning('Unable to load editor {}'.format(ep.name)) return None, None def editors(self, name=None): @@ -81,7 +84,10 @@ def editors(self, name=None): def initialize(self, name=None): for ep in self.iterator(group="preditor.plug.initialize"): - yield ep.load() + try: + yield ep.load() + except Exception: + _logger.warning('Unable to initialize plugin {}'.format(ep.name)) def loggerwindow(self, name=None): """Returns instances of "preditor.plug.loggerwindow" plugins. @@ -95,11 +101,17 @@ def loggerwindow(self, name=None): for ep in self.iterator(group="preditor.plug.loggerwindow"): if name and ep.name != name: continue - yield ep.name, ep.load() + try: + yield ep.name, ep.load() + except Exception: + _logger.warning('Unable to load plugin {}'.format(ep.name)) def logging_handlers(self, name=None): for ep in self.iterator(group="preditor.plug.logging_handlers"): - yield ep.name, ep.load() + try: + yield ep.name, ep.load() + except Exception: + _logger.warning('Unable to load handler {}'.format(ep.name)) @classmethod def iterator(cls, group=None, name=None): From d1ab1d3a30e707de38792560fbc5f97af8a8a395 Mon Sep 17 00:00:00 2001 From: Mike Hendricks Date: Mon, 2 Mar 2026 20:13:28 -0800 Subject: [PATCH 2/2] Show traceback for any errors encountered during plugin loads --- preditor/plugins.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/preditor/plugins.py b/preditor/plugins.py index d4ab56ea..82bd50d0 100644 --- a/preditor/plugins.py +++ b/preditor/plugins.py @@ -15,7 +15,8 @@ def about_module(self): if name in plugs: _logger.warning( 'Duplicate "preditor.plug.about_module" plugin found with ' - 'name "{}"'.format(name) + 'name "{}"'.format(name), + exc_info=True, ) else: plugs[name] = ep @@ -73,7 +74,10 @@ def editor(self, name): try: return plug_name, ep.load() except Exception: - _logger.warning('Unable to load editor {}'.format(ep.name)) + _logger.warning( + 'Unable to load editor {}'.format(ep.name), + exc_info=True, + ) return None, None def editors(self, name=None): @@ -87,7 +91,10 @@ def initialize(self, name=None): try: yield ep.load() except Exception: - _logger.warning('Unable to initialize plugin {}'.format(ep.name)) + _logger.warning( + 'Unable to initialize plugin {}'.format(ep.name), + exc_info=True, + ) def loggerwindow(self, name=None): """Returns instances of "preditor.plug.loggerwindow" plugins. @@ -104,14 +111,20 @@ def loggerwindow(self, name=None): try: yield ep.name, ep.load() except Exception: - _logger.warning('Unable to load plugin {}'.format(ep.name)) + _logger.warning( + 'Unable to load plugin {}'.format(ep.name), + exc_info=True, + ) def logging_handlers(self, name=None): for ep in self.iterator(group="preditor.plug.logging_handlers"): try: yield ep.name, ep.load() except Exception: - _logger.warning('Unable to load handler {}'.format(ep.name)) + _logger.warning( + 'Unable to load handler {}'.format(ep.name), + exc_info=True, + ) @classmethod def iterator(cls, group=None, name=None):