Get rid of transient errors during preprocessing and throw IOExceptions instead. Transient errors were only detected on IOExceptions, but preprocessing doesn't actually throw IOExceptions except if it fails before it even opens the main file, so there's no sense in trying to construct a package in that case.

--
MOS_MIGRATED_REVID=103119445
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index 95fef27..2de3167 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -800,9 +800,22 @@
             packageId, packageLocator);
         Preprocessor.Result preprocessingResult = preprocessCache.getIfPresent(packageId);
         if (preprocessingResult == null) {
-          preprocessingResult = replacementSource == null
-              ? packageFactory.preprocess(packageId, buildFilePath, inputSource, globber)
-              : Preprocessor.Result.noPreprocessing(replacementSource);
+          try {
+            preprocessingResult =
+                replacementSource == null
+                    ? packageFactory.preprocess(packageId, inputSource, globber)
+                    : Preprocessor.Result.noPreprocessing(replacementSource);
+          } catch (IOException e) {
+            env
+                .getListener()
+                .handle(
+                    Event.error(
+                        Location.fromFile(buildFilePath),
+                        "preprocessing failed: " + e.getMessage()));
+            throw new PackageFunctionException(
+                new BuildFileContainsErrorsException(packageId, "preprocessing failed", e),
+                Transience.TRANSIENT);
+          }
           preprocessCache.put(packageId, preprocessingResult);
         }