Fail gracefully when loading a .bzl file with an unknown or duplicate rule attribute flag

... instead of crashing the server with an IllegalArgumentException or
IllegalStateException.

RELNOTES: None
PiperOrigin-RevId: 360176332
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index 1e9cfd4..3433d15 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -476,7 +476,7 @@
 
     private Builder<TYPE> setPropertyFlag(PropertyFlag flag, String propertyName) {
       Preconditions.checkState(
-          !propertyFlags.contains(flag), "%s flag is already set", propertyName);
+          !propertyFlags.contains(flag), "'%s' flag is already set", propertyName);
       propertyFlags.add(flag);
       return this;
     }
@@ -484,15 +484,22 @@
     /**
      * Sets the property flag of the corresponding name if exists, otherwise throws an Exception.
      * Only meant to use from Starlark, do not use from Java.
+     *
+     * @throws EvalException if a property flag with the provided name does not exist or cannot be
+     *     set.
      */
-    public Builder<TYPE> setPropertyFlag(String propertyName) {
+    public Builder<TYPE> setPropertyFlag(String propertyName) throws EvalException {
       PropertyFlag flag = null;
       try {
         flag = PropertyFlag.valueOf(propertyName);
       } catch (IllegalArgumentException e) {
-        throw new IllegalArgumentException("unknown attribute flag " + propertyName);
+        throw Starlark.errorf("unknown attribute flag '%s'", propertyName);
       }
-      setPropertyFlag(flag, propertyName);
+      try {
+        setPropertyFlag(flag, propertyName);
+      } catch (IllegalStateException e) {
+        throw new EvalException(e);
+      }
       return this;
     }