anchor.diff:    // Load all the latest results for the selected bots, as well as flakiness
     // data, and the set of currently approved results. Each bot's latest build
     // is downloaded in parallel to make this phase faster.
  -  final testListFutures = <Future>[];
  +  final testListFutures = <Future<List<Test>>>[];
  +  final noResultsBuilds = new SplayTreeMap<String, String>();
     for (final String bot in bots) {
  -    testListFutures
  -        .add(loadResultsFromBot(bot, options, changelistBuilds[bot]));
  +    testListFutures.add(new Future(() async {
  +      try {
  +        return await loadResultsFromBot(bot, options, changelistBuilds[bot]);
  +      } on NoResultsException catch (e) {
  +        print(
  +            "Error: Failed to find results for $bot build <${e.buildUrl}>: $e");
  +        noResultsBuilds[bot] = e.buildUrl;
  +        return <Test>[];
  +      }
  +    }));
     }
   
     // Collect all the tests from the synchronous downloads.
  
positive.code: /// green.
  
  import 'dart:async';
  import 'dart:convert';
  import 'dart:io';
  import 'dart:math';
  
negative.code:   statistic(brokenTests.length, tests.length,
        "tests were broken since last approval");
  
    // Warn about any builders where results weren't available.
    if (noResultsBuilds.isNotEmpty) {
      print("");
      noResultsBuilds.forEach((String builder, String buildUrl) {
        print("Warning: No results were found for $builder: <$buildUrl>");
      });
      print("Warning: Builders without results are usually due to infrastructure "
          "issues, please have a closer look at the affected builders and try "
          "the build again.");
    }
  
    // Stop if there's nothing to do.
    if (unapprovedBots.isEmpty) {
      print("\nEvery test result has already been approved.");
  