]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/commitdiff
Shift exception formatting into the UI
authorChris Larson <chris_larson@mentor.com>
Fri, 6 May 2011 00:43:38 +0000 (17:43 -0700)
committerChris Larson <chris_larson@mentor.com>
Mon, 16 May 2011 19:39:42 +0000 (12:39 -0700)
Now we use bb.exceptions to pass pickleable traceback entries to the UI, and
the UI is free to do whatever it wants to do with this information. By
default, the log formatter for the UIs formats it with bb.exceptions.  This
also means that all exceptions should now show 3 lines of context and limit to
5 entries.

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

index 5d2f2a88e684e4451c06571769f5008b4055a2b2..e0e8bf55ad72be972360b10e823e1e72ee98ac62 100644 (file)
@@ -1125,7 +1125,7 @@ class CookerParser(object):
             return False
         except ParsingFailure as exc:
             self.shutdown(clean=False)
-            bb.fatal('Error parsing %s: %s' %
+            bb.fatal('Unable to parse %s: %s' %
                      (exc.recipe, bb.exceptions.to_string(exc.realexception)))
         except bb.parse.ParseError as exc:
             bb.fatal(str(exc))
@@ -1133,13 +1133,11 @@ class CookerParser(object):
             logger.error('Unable to parse %s', exc.recipe)
             sys.exit(1)
         except Exception as exc:
-            import traceback
             etype, value, tb = sys.exc_info()
-            formatted = bb.exceptions.format_extracted(value.traceback, limit=5)
-            formatted.extend(traceback.format_exception_only(etype, value))
-
+            logger.error('Unable to parse %s', value.recipe,
+                         exc_info=(etype, value, exc.traceback))
             self.shutdown(clean=False)
-            bb.fatal('Error parsing %s:\n%s' % (value.recipe, ''.join(formatted)))
+            sys.exit(1)
 
         self.current += 1
         self.virtuals += len(result)
index daca0a77071f197e2e0d5992477fb60874fd9bb6..16d936c1b6fc8d3f580e002dede874cd6aec249e 100644 (file)
@@ -422,8 +422,10 @@ class LogHandler(logging.Handler):
 
     def emit(self, record):
         if record.exc_info:
-            lines = traceback.format_exception(*record.exc_info, limit=5)
-            record.msg += '\n%s' % ''.join(lines)
+            etype, value, tb = record.exc_info
+            if hasattr(tb, 'tb_next'):
+                tb = list(bb.exceptions.extract_traceback(tb, context=3))
+            record.bb_exc_info = (etype, value, tb)
             record.exc_info = None
         fire(record, None)
 
index a7ac850790df05bcf175244594b031e98d51c398..12d19ff8e119727e66ab06ab468d0e0c8abf7375 100644 (file)
@@ -65,9 +65,15 @@ class BBLogFormatter(logging.Formatter):
     def format(self, record):
         record.levelname = self.getLevelName(record.levelno)
         if record.levelno == self.PLAIN:
-            return record.getMessage()
+            msg = record.getMessage()
         else:
-            return logging.Formatter.format(self, record)
+            msg = logging.Formatter.format(self, record)
+
+        if hasattr(record, 'bb_exc_info'):
+            etype, value, tb = record.bb_exc_info
+            formatted = bb.exceptions.format_exception(etype, value, tb, limit=5)
+            msg += '\n' + ''.join(formatted)
+        return msg
 
 class Loggers(dict):
     def __getitem__(self, key):