Print exceptions when cbuildbot misbehaves.

BUG=none
TEST=Lots of remote trybot runs.

Change-Id: Ib6153b154921b32303b458763552139b239d3867
Reviewed-on: https://gerrit.chromium.org/gerrit/45774
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Commit-Queue: David James <davidjames@chromium.org>
Tested-by: David James <davidjames@chromium.org>
diff --git a/scripts/cbuildbot.py b/scripts/cbuildbot.py
index b79b95c..e2018c7 100644
--- a/scripts/cbuildbot.py
+++ b/scripts/cbuildbot.py
@@ -19,6 +19,7 @@
 import pprint
 import sys
 import time
+import traceback
 
 from chromite.buildbot import builderstage as bs
 from chromite.buildbot import cbuildbot_config
@@ -308,15 +309,15 @@
         success = self._ReExecuteInBuildroot(sync_instance)
       else:
         self.RunStages()
-    except results_lib.StepFailure:
-      # StepFailure exceptions are already recorded in the report, so there
-      # is no need to print these tracebacks twice.
+    except Exception as ex:
+      # If the build is marked as successful, but threw exceptions, that's a
+      # problem.
       exception_thrown = True
-      if not print_report:
+      if results_lib.Results.BuildSucceededSoFar():
+        traceback.print_exc(file=sys.stdout)
         raise
-    except Exception:
-      exception_thrown = True
-      raise
+      if not (print_report and isinstance(ex, results_lib.StepFailure)):
+        raise
     finally:
       if print_report:
         results_lib.WriteCheckpoint(self.options.buildroot)