Don't crash when loading a non-existent exec transition .bzl file.

i.e.

`$ bazel build //foo --experimental_exec_config=//bar/does_not_exist.bzl%my_transition`

This is a small change but has lots of files because I had to move
`BzlLoadFailedException` into its own class. So a lot of simple reference updates.

Details:

 - `StarlarkExecTransitionLoader` is responsible for loading the exec transition.
 - It delegates to `BzlLoadFunction` to load the `bzl` file.
 - I need `StarlarkExecTransitionLoader` to anticipate `BzlLoadFailedException`.
 - I moved `BzlLoadFailedException` out of `BzlLoadFunction` to avoid a build
   dependency cycle: `BzlLoadFunction` is part of the catch-call
   `:skyframe_cluster` library, which itself depends on
   `StarlarkExecTransitionLoader`.
 - Kept a bunch of static `BzlLoadFailedException` instantiators in
  `BzlLoadFunction`. Many of these involve higher order types with the same
  dependency issues.
 - Updated the `BzlFileLoader` interface (which wraps `BzlLoadFunction` calls)
   to throw `BzlLoadFailedException`.
 - Updated `BzlFileLoader` implementations to check for that exception when Skyframe-evaluating.
 - Uncommented the test checking this functionality.

PiperOrigin-RevId: 585800246
Change-Id: I71921380a658eb6c441b2600f0758049162f85c0
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
index f44fdfe..e28223e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
@@ -1845,6 +1845,7 @@
         ":config/core_options",
         ":config/starlark_defined_config_transition",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
+        "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_failed_exception",
         "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:starlark_builtins_value",
         "//third_party:auto_value",
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkExecTransitionLoader.java b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkExecTransitionLoader.java
index 017a493..dc17be1 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkExecTransitionLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkExecTransitionLoader.java
@@ -18,6 +18,7 @@
 import com.google.devtools.build.lib.analysis.starlark.StarlarkAttributeTransitionProvider;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
+import com.google.devtools.build.lib.skyframe.BzlLoadFailedException;
 import com.google.devtools.build.lib.skyframe.BzlLoadValue;
 import com.google.devtools.build.lib.skyframe.StarlarkBuiltinsValue;
 import java.util.List;
@@ -46,7 +47,7 @@
      * Loads the given {@link BzlLoadValue.Key}. Returns null if not all Skyframe deps are ready.
      */
     @Nullable
-    BzlLoadValue getValue(BzlLoadValue.Key key) throws InterruptedException;
+    BzlLoadValue getValue(BzlLoadValue.Key key) throws BzlLoadFailedException, InterruptedException;
   }
 
   /**
@@ -75,14 +76,18 @@
     }
     TransitionReference parsedRef =
         TransitionReference.create(userRef, "--experimental_exec_config");
-    // TODO(b/301644122): catch and report BzlLoadFailedExceptions. This may required Bazel BUILD
-    // refactoring since BzlLoadFailedException is defined in BzlLoadFunction, which is part of
-    // the ":skyframe_cluster" target, which we can't depend on without dependency cycles.
-    BzlLoadValue bzlValue =
-        bzlFileLoader.getValue(
-            Objects.equals(parsedRef.bzlFile().getRepository(), StarlarkBuiltinsValue.BUILTINS_REPO)
-                ? BzlLoadValue.keyForBuiltins(parsedRef.bzlFile())
-                : BzlLoadValue.keyForBuild(parsedRef.bzlFile()));
+    BzlLoadValue bzlValue;
+    try {
+      bzlValue =
+          bzlFileLoader.getValue(
+              Objects.equals(
+                      parsedRef.bzlFile().getRepository(), StarlarkBuiltinsValue.BUILTINS_REPO)
+                  ? BzlLoadValue.keyForBuiltins(parsedRef.bzlFile())
+                  : BzlLoadValue.keyForBuild(parsedRef.bzlFile()));
+    } catch (BzlLoadFailedException e) {
+      throw new StarlarkExecTransitionLoadingException(
+          "--experimental_exec_config", userRef, e.getMessage());
+    }
     if (bzlValue == null) {
       return null;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD
index 62f23a6..a22f5fc 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD
@@ -218,6 +218,7 @@
         "//src/main/java/com/google/devtools/build/lib/profiler",
         "//src/main/java/com/google/devtools/build/lib/rules:repository/repository_directory_value",
         "//src/main/java/com/google/devtools/build/lib/rules:repository/repository_function",
+        "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_failed_exception",
         "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:client_environment_function",
         "//src/main/java/com/google/devtools/build/lib/skyframe:client_environment_value",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java
index 4cd81e7..533cf65 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java
@@ -53,8 +53,8 @@
 import com.google.devtools.build.lib.runtime.RepositoryRemoteExecutor;
 import com.google.devtools.build.lib.server.FailureDetails.ExternalDeps;
 import com.google.devtools.build.lib.server.FailureDetails.ExternalDeps.Code;
+import com.google.devtools.build.lib.skyframe.BzlLoadFailedException;
 import com.google.devtools.build.lib.skyframe.BzlLoadFunction;
-import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException;
 import com.google.devtools.build.lib.skyframe.BzlLoadValue;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
 import com.google.devtools.build.lib.util.Fingerprint;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/BUILD b/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/BUILD
index 9723704..3ee975a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/BUILD
@@ -28,9 +28,9 @@
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/profiler",
+        "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_failed_exception",
         "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:repository_mapping_value",
-        "//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_cluster",
         "//src/main/java/com/google/devtools/build/lib/util:filetype",
         "//src/main/java/com/google/devtools/build/skydoc/rendering:rendering_util",
         "//src/main/java/com/google/devtools/build/skydoc/rendering/proto:stardoc_output_java_proto",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/StarlarkDocExtract.java b/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/StarlarkDocExtract.java
index 9e61b76..00ee8de 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/StarlarkDocExtract.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/StarlarkDocExtract.java
@@ -48,7 +48,7 @@
 import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
 import com.google.devtools.build.lib.profiler.Profiler;
 import com.google.devtools.build.lib.profiler.SilentCloseable;
-import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException;
+import com.google.devtools.build.lib.skyframe.BzlLoadFailedException;
 import com.google.devtools.build.lib.skyframe.BzlLoadValue;
 import com.google.devtools.build.lib.skyframe.RepositoryMappingValue;
 import com.google.devtools.build.lib.skyframe.RepositoryMappingValue.RepositoryMappingResolutionException;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
index b72c392..931ba51 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
@@ -79,7 +79,6 @@
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.profiler.memory.CurrentRuleTracker;
 import com.google.devtools.build.lib.skyframe.AspectKeyCreator.AspectKey;
-import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor.BuildViewProvider;
 import com.google.devtools.build.lib.skyframe.config.BuildConfigurationKey;
 import com.google.devtools.build.lib.skyframe.toolchains.ToolchainException;
@@ -318,7 +317,8 @@
                 targetAndConfiguration.getConfiguration() == null
                     ? null
                     : targetAndConfiguration.getConfiguration().getOptions(),
-                (bzlKey) -> (BzlLoadValue) env.getValue(bzlKey));
+                (bzlKey) ->
+                    (BzlLoadValue) env.getValueOrThrow(bzlKey, BzlLoadFailedException.class));
         if (starlarkExecTransition == null) {
           return null; // Need Skyframe deps.
         }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
index f874842..228efd9 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -102,6 +102,7 @@
         ":build_result_listener",
         ":bzl_compile",
         ":bzl_load_cycle_reporter",
+        ":bzl_load_failed_exception",
         ":bzl_load_value",
         ":bzlmod_repo_cycle_reporter",
         ":cached_bzl_load_value_and_deps",
@@ -2405,6 +2406,17 @@
 )
 
 java_library(
+    name = "bzl_load_failed_exception",
+    srcs = ["BzlLoadFailedException.java"],
+    deps = [
+        ":sane_analysis_exception",
+        "//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code",
+        "//src/main/java/com/google/devtools/build/skyframe",
+        "//src/main/protobuf:failure_details_java_proto",
+    ],
+)
+
+java_library(
     name = "state_informing_sky_function_environment",
     srcs = ["StateInformingSkyFunctionEnvironment.java"],
     deps = [
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildTopLevelAspectsDetailsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildTopLevelAspectsDetailsFunction.java
index 130e16f..3b2b765 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildTopLevelAspectsDetailsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildTopLevelAspectsDetailsFunction.java
@@ -34,7 +34,6 @@
 import com.google.devtools.build.lib.server.FailureDetails.Analysis.Code;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
 import com.google.devtools.build.lib.skyframe.AspectKeyCreator.AspectKey;
-import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.skyframe.SkyFunction;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFailedException.java b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFailedException.java
new file mode 100644
index 0000000..ade93f4
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFailedException.java
@@ -0,0 +1,72 @@
+// Copyright 2023 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.skyframe;
+
+import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
+import com.google.devtools.build.lib.server.FailureDetails.StarlarkLoading;
+import com.google.devtools.build.lib.server.FailureDetails.StarlarkLoading.Code;
+import com.google.devtools.build.lib.util.DetailedExitCode;
+import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
+
+/** Exceptions from {@link BzlLoadFunction}. */
+public final class BzlLoadFailedException extends Exception implements SaneAnalysisException {
+  private final Transience transience;
+  private final DetailedExitCode detailedExitCode;
+
+  private BzlLoadFailedException(
+      String errorMessage, DetailedExitCode detailedExitCode, Transience transience) {
+    super(errorMessage);
+    this.transience = transience;
+    this.detailedExitCode = detailedExitCode;
+  }
+
+  BzlLoadFailedException(String errorMessage, DetailedExitCode detailedExitCode) {
+    this(errorMessage, detailedExitCode, Transience.PERSISTENT);
+  }
+
+  BzlLoadFailedException(
+      String errorMessage,
+      DetailedExitCode detailedExitCode,
+      Exception cause,
+      Transience transience) {
+    super(errorMessage, cause);
+    this.transience = transience;
+    this.detailedExitCode = detailedExitCode;
+  }
+
+  BzlLoadFailedException(String errorMessage, Code code) {
+    this(errorMessage, createDetailedExitCode(errorMessage, code), Transience.PERSISTENT);
+  }
+
+  BzlLoadFailedException(String errorMessage, Code code, Exception cause, Transience transience) {
+    this(errorMessage, createDetailedExitCode(errorMessage, code), cause, transience);
+  }
+
+  Transience getTransience() {
+    return transience;
+  }
+
+  @Override
+  public DetailedExitCode getDetailedExitCode() {
+    return detailedExitCode;
+  }
+
+  static DetailedExitCode createDetailedExitCode(String message, Code code) {
+    return DetailedExitCode.of(
+        FailureDetail.newBuilder()
+            .setMessage(message)
+            .setStarlarkLoading(StarlarkLoading.newBuilder().setCode(code))
+            .build());
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java
index 1d4cc4b..08a3ee4 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java
@@ -47,8 +47,6 @@
 import com.google.devtools.build.lib.packages.SymbolGenerator;
 import com.google.devtools.build.lib.packages.WorkspaceFileValue;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
-import com.google.devtools.build.lib.server.FailureDetails.StarlarkLoading;
 import com.google.devtools.build.lib.server.FailureDetails.StarlarkLoading.Code;
 import com.google.devtools.build.lib.skyframe.StarlarkBuiltinsFunction.BuiltinsFailedException;
 import com.google.devtools.build.lib.util.DetailedExitCode;
@@ -553,7 +551,7 @@
     try {
       compileValue = getter.getBzlCompileValue(compileKey, env);
     } catch (BzlCompileFunction.FailedIOException e) {
-      throw BzlLoadFailedException.errorReadingBzl(filePath, e);
+      throw errorReadingBzl(filePath, e);
     }
     if (compileValue == null) {
       return null;
@@ -609,7 +607,7 @@
             /* bzlLoadFunction= */ this);
       }
     } catch (BuiltinsFailedException e) {
-      throw BzlLoadFailedException.builtinsFailed(key.getLabel(), e);
+      throw builtinsFailed(key.getLabel(), e);
     }
   }
 
@@ -649,7 +647,7 @@
     // Bypass package lookup entirely if builtins.
     if (key.isBuiltins()) {
       if (!label.getPackageName().isEmpty()) {
-        throw BzlLoadFailedException.noBuildFile(label, "@_builtins cannot have subpackages");
+        throw noBuildFile(label, "@_builtins cannot have subpackages");
       }
       return key.getCompileKey(getBuiltinsRoot(builtinsBzlPath));
     }
@@ -666,7 +664,7 @@
                   BuildFileNotFoundException.class,
                   InconsistentFilesystemException.class);
     } catch (BuildFileNotFoundException | InconsistentFilesystemException e) {
-      throw BzlLoadFailedException.errorFindingContainingPackage(label.toPathFragment(), e);
+      throw errorFindingContainingPackage(label.toPathFragment(), e);
     }
     if (packageLookup == null) {
       return null;
@@ -685,10 +683,9 @@
         compileKey = key.getCompileKey(packageLookup.getContainingPackageRoot());
       } else {
         if (!packageLookup.hasContainingPackage()) {
-          throw BzlLoadFailedException.noBuildFile(
-              label, packageLookup.getReasonForNoContainingPackage());
+          throw noBuildFile(label, packageLookup.getReasonForNoContainingPackage());
         } else {
-          throw BzlLoadFailedException.labelCrossesPackageBoundary(label, packageLookup);
+          throw labelCrossesPackageBoundary(label, packageLookup);
         }
       }
     }
@@ -1153,7 +1150,7 @@
       try {
         bzlLoads.add((BzlLoadValue) values.getOrThrow(keys.get(i), BzlLoadFailedException.class));
       } catch (BzlLoadFailedException ex) {
-        throw BzlLoadFailedException.whileLoadingDep(programLoads.get(i).second, ex);
+        throw whileLoadingDep(programLoads.get(i).second, ex);
       }
     }
     return env.valuesMissing() ? null : bzlLoads;
@@ -1197,7 +1194,7 @@
         cachedData = computeInlineCachedData(keys.get(i), inliningState);
       } catch (BzlLoadFailedException e) {
         if (deferredException == null) {
-          deferredException = BzlLoadFailedException.whileLoadingDep(programLoads.get(i).second, e);
+          deferredException = whileLoadingDep(programLoads.get(i).second, e);
         }
         continue;
       }
@@ -1273,7 +1270,7 @@
       }
     }
     if (foundViolation && !demoteErrorsToWarnings) {
-      throw BzlLoadFailedException.visibilityViolation(requestingFileDescription);
+      throw visibilityViolation(requestingFileDescription);
     }
   }
 
@@ -1360,7 +1357,7 @@
 
       execAndExport(prog, label, starlarkEventHandler, module, thread);
       if (sawStarlarkError.get()) {
-        throw BzlLoadFailedException.executionFailed(label);
+        throw executionFailed(label);
       }
     }
   }
@@ -1496,59 +1493,6 @@
     }
   }
 
-  /** Indicates a failure to load a .bzl file. */
-  public static final class BzlLoadFailedException extends Exception
-      implements SaneAnalysisException {
-    private final Transience transience;
-    private final DetailedExitCode detailedExitCode;
-
-    private BzlLoadFailedException(
-        String errorMessage, DetailedExitCode detailedExitCode, Transience transience) {
-      super(errorMessage);
-      this.transience = transience;
-      this.detailedExitCode = detailedExitCode;
-    }
-
-    private BzlLoadFailedException(String errorMessage, DetailedExitCode detailedExitCode) {
-      this(errorMessage, detailedExitCode, Transience.PERSISTENT);
-    }
-
-    private BzlLoadFailedException(
-        String errorMessage,
-        DetailedExitCode detailedExitCode,
-        Exception cause,
-        Transience transience) {
-      super(errorMessage, cause);
-      this.transience = transience;
-      this.detailedExitCode = detailedExitCode;
-    }
-
-    private BzlLoadFailedException(String errorMessage, Code code) {
-      this(errorMessage, createDetailedExitCode(errorMessage, code), Transience.PERSISTENT);
-    }
-
-    private BzlLoadFailedException(
-        String errorMessage, Code code, Exception cause, Transience transience) {
-      this(errorMessage, createDetailedExitCode(errorMessage, code), cause, transience);
-    }
-
-    Transience getTransience() {
-      return transience;
-    }
-
-    @Override
-    public DetailedExitCode getDetailedExitCode() {
-      return detailedExitCode;
-    }
-
-    private static DetailedExitCode createDetailedExitCode(String message, Code code) {
-      return DetailedExitCode.of(
-          FailureDetail.newBuilder()
-              .setMessage(message)
-              .setStarlarkLoading(StarlarkLoading.newBuilder().setCode(code))
-              .build());
-    }
-
     private static BzlLoadFailedException whileLoadingDep(
         Location loc, BzlLoadFailedException cause) {
       // Don't chain exception cause, just incorporate the message with a prefix.
@@ -1573,10 +1517,11 @@
       String errorMessage =
           String.format(
               "Encountered error while reading extension file '%s': %s", file, cause.getMessage());
-      DetailedExitCode detailedExitCode =
-          cause instanceof DetailedException
-              ? ((DetailedException) cause).getDetailedExitCode()
-              : createDetailedExitCode(errorMessage, Code.CONTAINING_PACKAGE_NOT_FOUND);
+    DetailedExitCode detailedExitCode =
+        cause instanceof DetailedException
+            ? ((DetailedException) cause).getDetailedExitCode()
+            : BzlLoadFailedException.createDetailedExitCode(
+                errorMessage, Code.CONTAINING_PACKAGE_NOT_FOUND);
       return new BzlLoadFailedException(
           errorMessage, detailedExitCode, cause, Transience.PERSISTENT);
     }
@@ -1639,11 +1584,11 @@
           String.format("%s contains .bzl load visibility violations", fileDescription),
           Code.VISIBILITY_ERROR);
     }
-  }
+
 
   private static final class BzlLoadFunctionException extends SkyFunctionException {
     private BzlLoadFunctionException(BzlLoadFailedException cause) {
-      super(cause, cause.transience);
+      super(cause, cause.getTransience());
     }
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/DependencyResolver.java b/src/main/java/com/google/devtools/build/lib/skyframe/DependencyResolver.java
index 311660c..a4c0da9 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/DependencyResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/DependencyResolver.java
@@ -379,7 +379,7 @@
               targetAndConfiguration.getConfiguration() == null
                   ? null
                   : targetAndConfiguration.getConfiguration().getOptions(),
-              (bzlKey) -> (BzlLoadValue) env.getValue(bzlKey));
+              (bzlKey) -> (BzlLoadValue) env.getValueOrThrow(bzlKey, BzlLoadFailedException.class));
       if (starlarkExecTransition == null) {
         return false;
       }
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 32b8065..3e22e47 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
@@ -61,7 +61,6 @@
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
 import com.google.devtools.build.lib.server.FailureDetails.PackageLoading;
 import com.google.devtools.build.lib.server.FailureDetails.PackageLoading.Code;
-import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException;
 import com.google.devtools.build.lib.skyframe.GlobValue.InvalidGlobPatternException;
 import com.google.devtools.build.lib.skyframe.RepoFileFunction.BadRepoFileException;
 import com.google.devtools.build.lib.skyframe.StarlarkBuiltinsFunction.BuiltinsFailedException;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
index b06477d..4b36ac5 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
@@ -1306,7 +1306,11 @@
     Optional<StarlarkAttributeTransitionProvider> starlarkExecTransition =
         StarlarkExecTransitionLoader.loadStarlarkExecTransition(
             configuration == null ? null : configuration.getOptions(),
-            (bzlKey) -> (BzlLoadValue) analysisEnvironment.getSkyframeEnv().getValue(bzlKey));
+            (bzlKey) ->
+                (BzlLoadValue)
+                    analysisEnvironment
+                        .getSkyframeEnv()
+                        .getValueOrThrow(bzlKey, BzlLoadFailedException.class));
     if (starlarkExecTransition == null) {
       return null;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunction.java
index 2ffbc6c..149c68e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunction.java
@@ -19,7 +19,6 @@
 import com.google.devtools.build.lib.packages.BazelStarlarkEnvironment;
 import com.google.devtools.build.lib.packages.BazelStarlarkEnvironment.InjectionException;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException;
 import com.google.devtools.build.skyframe.RecordingSkyFunctionEnvironment;
 import com.google.devtools.build.skyframe.SkyFunction;
 import com.google.devtools.build.skyframe.SkyFunctionException;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/config/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/config/BUILD
index 9535224..ffdf5b6 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/config/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/config/BUILD
@@ -43,6 +43,7 @@
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/packages/semantics",
         "//src/main/java/com/google/devtools/build/lib/pkgcache",
+        "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_failed_exception",
         "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:package_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/config/BaselineOptionsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/config/BaselineOptionsFunction.java
index b1ec323..42f546a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/config/BaselineOptionsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/config/BaselineOptionsFunction.java
@@ -27,6 +27,7 @@
 import com.google.devtools.build.lib.analysis.starlark.StarlarkAttributeTransitionProvider;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.AttributeTransitionData;
+import com.google.devtools.build.lib.skyframe.BzlLoadFailedException;
 import com.google.devtools.build.lib.skyframe.BzlLoadValue;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
 import com.google.devtools.build.skyframe.SkyFunction;
@@ -66,7 +67,8 @@
     try {
       starlarkExecTransition =
           StarlarkExecTransitionLoader.loadStarlarkExecTransition(
-              mappedBaselineOptions, (bzlKey) -> (BzlLoadValue) env.getValue(bzlKey));
+              mappedBaselineOptions,
+              (bzlKey) -> (BzlLoadValue) env.getValueOrThrow(bzlKey, BzlLoadFailedException.class));
     } catch (StarlarkExecTransitionLoadingException e) {
       throw new BaselineOptionsFunctionException(e);
     }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactoryTest.java b/src/test/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactoryTest.java
index 1fc6f2a..41f0144 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactoryTest.java
@@ -196,10 +196,8 @@
         + " //pkg:file.bzl%%symbol'}",
     "{cmdLineRef: '//test:defs.bzl%symbol_doesnt_exist', expectedError: 'symbol_doesnt_exist not"
         + " found in //test:defs.bzl'}",
-    // TODO(b/301644122): Enable when we can process BzlLoadFailedException. See similar TODO in
-    // StarlarkExecTransitionLoader.java for details.
-    //   "{cmdLineRef: '//test:file_doesnt_exist.bzl%symbol', expectedError:"
-    //     + " '''//test:file_doesnt_exist.bzl'': no such file'}",
+    "{cmdLineRef: '//test:file_doesnt_exist.bzl%symbol', expectedError:"
+        + " '''//test:file_doesnt_exist.bzl'': no such file'}",
     "{cmdLineRef: '//test:defs.bzl%not_a_transition', expectedError: 'not_a_transition is not a"
         + " Starlark transition.'}"
   })
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
index 7ba87fe..74af52e 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -204,6 +204,7 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe:broken_diff_awareness_exception",
         "//src/main/java/com/google/devtools/build/lib/skyframe:builder",
         "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_compile",
+        "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_failed_exception",
         "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:cached_bzl_load_value_and_deps",
         "//src/main/java/com/google/devtools/build/lib/skyframe:cached_bzl_load_value_and_deps_builder_factory",
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/BzlLoadFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/BzlLoadFunctionTest.java
index 6160a78..1cc32eb2 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/BzlLoadFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/BzlLoadFunctionTest.java
@@ -30,7 +30,6 @@
 import com.google.devtools.build.lib.pkgcache.PackageOptions;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.runtime.QuiescingExecutorsImpl;
-import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException;
 import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.DigestHashFunction;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java
index 8f68a1b..fc03b0f 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java
@@ -140,7 +140,8 @@
                 targetAndConfiguration.getTarget() == null
                     ? null
                     : targetAndConfiguration.getConfiguration().getOptions(),
-                (bzlKey) -> (BzlLoadValue) env.getValue(bzlKey));
+                (bzlKey) ->
+                    (BzlLoadValue) env.getValueOrThrow(bzlKey, BzlLoadFailedException.class));
         if (starlarkExecTransition == null) {
           return null;
         }