report exceptions when enabling and disabling modules in blenders interface.

so if pressing the addon checkbox fails it tells why rather then failing silently.
This commit is contained in:
Campbell Barton 2013-06-19 05:17:31 +00:00
parent dd54b99b33
commit 841c200767
2 changed files with 37 additions and 9 deletions

@ -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"))

@ -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'}