]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/commitdiff
event: improve output when eventhandler exec fails
authorChris Larson <chris_larson@mentor.com>
Mon, 4 Apr 2011 18:31:39 +0000 (11:31 -0700)
committerChris Larson <chris_larson@mentor.com>
Mon, 4 Apr 2011 21:23:09 +0000 (14:23 -0700)
- Name the event handler by its actual name, so the traceback shows it rather
  than 'tmpHandler'.
- Rather than immediately aborting when encountering an event handler error,
  display an error message and try to continue.
- Show a traceback for ordinary exceptions, skipping the first entry in the
  traceback, so it only shows the useful information.
- Show an error, but no traceback, for SystemExit with a code other than 0.
- For for SystemExit with a code of 0, simply continue silently.

Signed-off-by: Chris Larson <chris_larson@mentor.com>
lib/bb/event.py

index 289217aaad7594e34794e692e4ac187e729cf153..498a424ad9e3159377dafa8b9506497c4594a5d6 100644 (file)
@@ -38,6 +38,8 @@ import bb.utils
 worker_pid = 0
 worker_pipe = None
 
+logger = logging.getLogger('BitBake.Event')
+
 class Event(object):
     """Base class for events"""
 
@@ -59,18 +61,35 @@ _ui_handler_seq = 0
 bb.utils._context["NotHandled"] = NotHandled
 bb.utils._context["Handled"] = Handled
 
+def execute_handler(name, handler, event, d):
+    event.data = d
+    try:
+        ret = handler(event)
+    except Exception:
+        etype, value, tb = sys.exc_info()
+        logger.error("Execution of event handler '%s' failed" % name,
+                        exc_info=(etype, value, tb.tb_next))
+        raise
+    except SystemExit as exc:
+        if exc.code != 0:
+            logger.error("Execution of event handler '%s' failed" % name)
+        raise
+    finally:
+        del event.data
+
+    if ret is not None:
+        warnings.warn("Using Handled/NotHandled in event handlers is deprecated",
+                        DeprecationWarning, stacklevel = 2)
+
 def fire_class_handlers(event, d):
     if isinstance(event, logging.LogRecord):
         return
 
-    for handler in _handlers.itervalues():
-        event.data = d
-        ret = handler(event)
-        if ret is not None:
-            warnings.warn("Using Handled/NotHandled in event handlers is deprecated",
-                          DeprecationWarning, stacklevel = 2)
-
-        del event.data
+    for name, handler in _handlers.iteritems():
+        try:
+            execute_handler(name, handler, event, d)
+        except BaseException:
+            continue
 
 ui_queue = []
 @atexit.register
@@ -142,11 +161,12 @@ def register(name, handler):
     if handler is not None:
         # handle string containing python code
         if isinstance(handler, basestring):
-            tmp = "def tmpHandler(e):\n%s" % handler
-            comp = bb.utils.better_compile(tmp, "tmpHandler(e)", "bb.event._registerCode")
+            tmp = "def %s(e):\n%s" % (name, handler)
+            comp = bb.utils.better_compile(tmp, "%s(e)" % name,
+                                           "bb.event._registerCode")
             env = {}
             bb.utils.simple_exec(comp, env)
-            func = bb.utils.better_eval("tmpHandler", env)
+            func = bb.utils.better_eval(name, env)
             _handlers[name] = func
         else:
             _handlers[name] = handler