Quando deve ser lançada uma IllegalArgumentException?

Estou preocupado que esta seja uma exceção de tempo de execução, por isso provavelmente deve ser usado com moderação.
Caso de uso padrão:

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

Mas isso parece forçar o seguinte design:

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

Para voltar a ser uma exceção verificada.

Ok, mas vamos com isso. Se você der entrada ruim, você receberá um erro de execução. Então, em primeiro lugar, isso é realmente uma política bastante difícil de implementar uniformemente, porque você poderia ter que fazer a conversão exatamente oposta:

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

E pior - enquanto verifica0 <= pct && pct <= 100 Pode-se esperar que o código do cliente faça estaticamente, isso não é para dados mais avançados, como um endereço de e-mail, ou pior, algo que deve ser verificado em um banco de dados, portanto, código de cliente geral não pode pré-validar.

Então, basicamente, o que estou dizendo é que não vejo uma política coerente significativa para o uso deIllegalArgumentException. Parece que não deve ser usado e devemos nos ater às nossas próprias exceções verificadas. O que é um bom caso de uso para jogar isso?

questionAnswers(6)

yourAnswerToTheQuestion