From ade4a46c866307f0f607f0b3be7b97dfa0adfa4d Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sun, 17 Nov 2024 11:03:09 +0000 Subject: [PATCH] Improved exception handling for plugin loading --- src/backend/InvenTree/plugin/helpers.py | 62 ++++++++++++++----------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/src/backend/InvenTree/plugin/helpers.py b/src/backend/InvenTree/plugin/helpers.py index 0aaf231bf5..b9e86f6a01 100644 --- a/src/backend/InvenTree/plugin/helpers.py +++ b/src/backend/InvenTree/plugin/helpers.py @@ -177,41 +177,47 @@ def get_modules(pkg, path=None): elif type(path) is not list: path = [path] - try: - for finder, name, _ in pkgutil.walk_packages(path): - try: - if sys.version_info < (3, 12): - module = finder.find_module(name).load_module(name) - else: - spec = finder.find_spec(name) - module = module_from_spec(spec) - sys.modules[name] = module - spec.loader.exec_module(module) - pkg_names = getattr(module, '__all__', None) - for k, v in vars(module).items(): - if not k.startswith('_') and (pkg_names is None or k in pkg_names): - context[k] = v - context[name] = module - except AppRegistryNotReady: # pragma: no cover - pass - except Exception as error: - # this 'protects' against malformed plugin modules by more or less silently failing + packages = pkgutil.walk_packages(path) - # log to stack - log_error({name: str(error)}, 'discovery') - except Exception as error: - # log to stack - log_error({pkg.__name__: str(error)}, 'discovery') + while True: + try: + finder, name, _ = next(packages) + except StopIteration: + break + except Exception as error: + log_error({pkg.__name__: str(error)}, 'discovery') + continue + + try: + if sys.version_info < (3, 12): + module = finder.find_module(name).load_module(name) + else: + spec = finder.find_spec(name) + module = module_from_spec(spec) + sys.modules[name] = module + spec.loader.exec_module(module) + pkg_names = getattr(module, '__all__', None) + for k, v in vars(module).items(): + if not k.startswith('_') and (pkg_names is None or k in pkg_names): + context[k] = v + context[name] = module + except AppRegistryNotReady: # pragma: no cover + pass + except Exception as error: + # this 'protects' against malformed plugin modules by more or less silently failing + + # log to stack + log_error({name: str(error)}, 'discovery') return [v for k, v in context.items()] def get_classes(module) -> list: """Get all classes in a given module.""" - try: - return inspect.getmembers(module, inspect.isclass) - except Exception: - return [] + # try: + return inspect.getmembers(module, inspect.isclass) + # except Exception: + # return [] def get_plugins(pkg, baseclass, path=None):