diff options
author | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2008-10-08 10:26:16 (GMT) |
---|---|---|
committer | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2008-10-08 10:26:16 (GMT) |
commit | 77575b4e3b9642a0354807caa6af60922fc14a1d (patch) | |
tree | 5e7d32fda49384b1bcea023e8692a7866bb59472 /src/jarabe | |
parent | fb24b313694e06e340be5074d9740e5ef64bb591 (diff) |
Make the shell more resilient to bugs in extensions
Diffstat (limited to 'src/jarabe')
-rw-r--r-- | src/jarabe/controlpanel/cmd.py | 14 | ||||
-rw-r--r-- | src/jarabe/controlpanel/gui.py | 46 | ||||
-rw-r--r-- | src/jarabe/frame/devicestray.py | 13 |
3 files changed, 47 insertions, 26 deletions
diff --git a/src/jarabe/controlpanel/cmd.py b/src/jarabe/controlpanel/cmd.py index a1eb044..9a8ed9e 100644 --- a/src/jarabe/controlpanel/cmd.py +++ b/src/jarabe/controlpanel/cmd.py @@ -18,6 +18,7 @@ import sys import getopt import os from gettext import gettext as _ +import traceback from jarabe import config @@ -58,10 +59,15 @@ def load_modules(): for item in folder: if os.path.isdir(os.path.join(path, item)) and \ - os.path.exists(os.path.join(path, item, 'model.py')): - module = __import__('.'.join(('cpsection', item, 'model')), - globals(), locals(), ['model']) - modules.append(module) + os.path.exists(os.path.join(path, item, 'model.py')): + try: + module = __import__('.'.join(('cpsection', item, 'model')), + globals(), locals(), ['model']) + except Exception: + logging.error('Exception while loading extension:\n' + \ + ''.join(traceback.format_exception(*sys.exc_info()))) + else: + modules.append(module) return modules diff --git a/src/jarabe/controlpanel/gui.py b/src/jarabe/controlpanel/gui.py index f4e3081..8b63b78 100644 --- a/src/jarabe/controlpanel/gui.py +++ b/src/jarabe/controlpanel/gui.py @@ -14,11 +14,14 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -import gtk import os -import gobject import logging from gettext import gettext as _ +import sys +import traceback + +import gobject +import gtk from sugar.graphics.icon import Icon from sugar.graphics import style @@ -231,23 +234,28 @@ class ControlPanel(gtk.Window): for item in folder: if os.path.isdir(os.path.join(path, item)) and \ os.path.exists(os.path.join(path, item, '__init__.py')): - mod = __import__('.'.join(('cpsection', item)), - globals(), locals(), [item]) - view_class = getattr(mod, 'CLASS', None) - if view_class is not None: - options[item] = {} - options[item]['alerts'] = [] - options[item]['view'] = view_class - options[item]['icon'] = getattr(mod, 'ICON', item) - options[item]['title'] = getattr(mod, 'TITLE', item) - options[item]['color'] = getattr(mod, 'COLOR', None) - keywords = getattr(mod, 'KEYWORDS', []) - keywords.append(options[item]['title'].lower()) - if item not in keywords: - keywords.append(item) - else: - _logger.error('There is no CLASS constant specified in ' \ - 'the view file \'%s\'.' % item) + try: + mod = __import__('.'.join(('cpsection', item)), + globals(), locals(), [item]) + view_class = getattr(mod, 'CLASS', None) + if view_class is not None: + options[item] = {} + options[item]['alerts'] = [] + options[item]['view'] = view_class + options[item]['icon'] = getattr(mod, 'ICON', item) + options[item]['title'] = getattr(mod, 'TITLE', item) + options[item]['color'] = getattr(mod, 'COLOR', None) + keywords = getattr(mod, 'KEYWORDS', []) + keywords.append(options[item]['title'].lower()) + if item not in keywords: + keywords.append(item) + else: + _logger.error('There is no CLASS constant specifieds ' \ + 'in the view file \'%s\'.' % item) + except Exception: + logging.error('Exception while loading extension:\n' + \ + ''.join(traceback.format_exception(*sys.exc_info()))) + return options def __cancel_clicked_cb(self, widget): diff --git a/src/jarabe/frame/devicestray.py b/src/jarabe/frame/devicestray.py index ba2805d..8514efb 100644 --- a/src/jarabe/frame/devicestray.py +++ b/src/jarabe/frame/devicestray.py @@ -15,6 +15,9 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import os +import sys +import traceback +import logging from sugar.graphics import tray @@ -27,9 +30,13 @@ class DevicesTray(tray.HTray): for f in os.listdir(os.path.join(config.ext_path, 'deviceicon')): if f.endswith('.py') and not f.startswith('__'): module_name = f[:-3] - mod = __import__('deviceicon.' + module_name, globals(), - locals(), [module_name]) - mod.setup(self) + try: + mod = __import__('deviceicon.' + module_name, globals(), + locals(), [module_name]) + mod.setup(self) + except Exception: + logging.error('Exception while loading extension:\n' + \ + ''.join(traceback.format_exception(*sys.exc_info()))) def add_device(self, view): index = 0 |