Don't crash if no cycle reporter can handle a found cycle. We can display a (non-ideal) version and file a bug report.

PiperOrigin-RevId: 295789287
diff --git a/src/main/java/com/google/devtools/build/skyframe/CyclesReporter.java b/src/main/java/com/google/devtools/build/skyframe/CyclesReporter.java
index 68ff579..0637dd6 100644
--- a/src/main/java/com/google/devtools/build/skyframe/CyclesReporter.java
+++ b/src/main/java/com/google/devtools/build/skyframe/CyclesReporter.java
@@ -15,6 +15,8 @@
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.bugreport.BugReport;
+import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.ExtendedEventHandler;
 
 /**
@@ -83,8 +85,15 @@
         return;
       }
     }
-    throw new IllegalStateException(
-        printArbitraryCycle(topLevelKey, cycleInfo, alreadyReported) + "\n" + cycleReporters);
+
+    // No proper cycle reporter could be found. Blaze bug! Not fatal, though.
+    String rawCycle = printArbitraryCycle(topLevelKey, cycleInfo, alreadyReported);
+    eventHandler.handle(
+        Event.error(
+            "Cycle detected but could not be properly displayed due to an internal problem. Please"
+                + " file an issue. Raw display: "
+                + rawCycle));
+    BugReport.sendBugReport(new IllegalStateException(rawCycle + "\n" + cycleReporters));
   }
 
   private static String printArbitraryCycle(