From 841c200767bbc84afa6d1ce186dabe234fc0aaf5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 19 Jun 2013 05:17:31 +0000 Subject: report exceptions when enabling and disabling modules in blenders interface. so if pressing the addon checkbox fails it tells why rather then failing silently. --- release/scripts/modules/addon_utils.py | 20 +++++++++++++------- release/scripts/startup/bl_operators/wm.py | 26 ++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 9 deletions(-) (limited to 'release') diff --git a/release/scripts/modules/addon_utils.py b/release/scripts/modules/addon_utils.py index 7e7612e56d8..a197c20fdab 100644 --- a/release/scripts/modules/addon_utils.py +++ b/release/scripts/modules/addon_utils.py @@ -239,7 +239,7 @@ def _addon_remove(module_name): addons.remove(addon) -def enable(module_name, default_set=True, persistent=False): +def enable(module_name, default_set=True, persistent=False, handle_error=None): """ Enables an addon by name. @@ -253,9 +253,10 @@ def enable(module_name, default_set=True, persistent=False): import sys from bpy_restrict_state import RestrictBlend - def handle_error(): - import traceback - traceback.print_exc() + if handle_error is None: + def handle_error(): + import traceback + traceback.print_exc() # reload if the mtime changes mod = sys.modules.get(module_name) @@ -322,7 +323,7 @@ def enable(module_name, default_set=True, persistent=False): return mod -def disable(module_name, default_set=True): +def disable(module_name, default_set=True, handle_error=None): """ Disables an addon by name. @@ -330,6 +331,12 @@ def disable(module_name, default_set=True): :type module_name: string """ import sys + + if handle_error is None: + def handle_error(): + import traceback + traceback.print_exc() + mod = sys.modules.get(module_name) # possible this addon is from a previous session and didn't load a @@ -344,8 +351,7 @@ def disable(module_name, default_set=True): except: print("Exception in module unregister(): %r" % getattr(mod, "__file__", module_name)) - import traceback - traceback.print_exc() + handle_error() else: print("addon_utils.disable: %s not %s." % (module_name, "disabled" if mod is None else "loaded")) diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index fd1f538efd3..fba7672e846 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -1574,8 +1574,15 @@ class WM_OT_addon_enable(Operator): def execute(self, context): import addon_utils + + err_str = "" + def err_cb(): + import traceback + nonlocal err_str + err_str = traceback.format_exc() + print(err_str) - mod = addon_utils.enable(self.module) + mod = addon_utils.enable(self.module, handle_error=err_cb) if mod: info = addon_utils.module_bl_info(mod) @@ -1590,6 +1597,10 @@ class WM_OT_addon_enable(Operator): info_ver) return {'FINISHED'} else: + + if err_str: + self.report({'ERROR'}, err_str) + return {'CANCELLED'} @@ -1606,7 +1617,18 @@ class WM_OT_addon_disable(Operator): def execute(self, context): import addon_utils - addon_utils.disable(self.module) + err_str = "" + def err_cb(): + import traceback + nonlocal err_str + err_str = traceback.format_exc() + print(err_str) + + addon_utils.disable(self.module, handle_error=err_cb) + + if err_str: + self.report({'ERROR'}, err_str) + return {'FINISHED'} -- cgit v1.2.3