¿Cuándo debería lanzarse una IllegalArgumentException?

Me preocupa que esta sea una excepción de tiempo de ejecución, por lo que probablemente debería usarse con moderación.
Caso de uso estándar:

void setPercentage(int pct) {
    if( pct < 0 || pct > 100) {
         throw new IllegalArgumentException("bad percent");
     }
}

Pero eso parece que forzaría el siguiente diseño:

public void computeScore() throws MyPackageException {
      try {
          setPercentage(userInputPercent);
      }
      catch(IllegalArgumentException exc){
           throw new MyPackageException(exc);
      }
 }

Para volver a ser una excepción comprobada.

Está bien, pero vamos con eso. Si da una entrada incorrecta, obtendrá un error de tiempo de ejecución. Entonces, en primer lugar, es una política bastante difícil de implementar de manera uniforme, ya que podría tener que hacer la conversión opuesta:

public void scanEmail(String emailStr, InputStream mime) {
    try {
        EmailAddress parsedAddress = EmailUtil.parse(emailStr);
    }
    catch(ParseException exc){
        throw new IllegalArgumentException("bad email", exc);
    }
}

Y lo que es peor, mientras se comprueba.0 <= pct && pct <= 100&nbsp;Se podría esperar que el código del cliente se ejecute de manera estática, esto no es así para datos más avanzados, como una dirección de correo electrónico, o peor aún, algo que debe verificarse en una base de datos, por lo tanto, en general, el código del cliente no puede validarse previamente.

Básicamente, lo que estoy diciendo es que no veo una política coherente significativa para el uso deIllegalArgumentException. Parece que no debería usarse y deberíamos atenernos a nuestras propias excepciones verificadas. ¿Cuál es un buen caso de uso para tirar esto?