Меня беспокоит, что это исключение во время выполнения, поэтому его, вероятно, следует использовать с осторожностью.
Стандартный вариант использования:
void setPercentage(int pct) {
if( pct < 0 || pct > 100) {
throw new IllegalArgumentException("bad percent");
}
}
Но похоже, что это приведет к следующему дизайну:
public void computeScore() throws MyPackageException {
try {
setPercentage(userInputPercent);
}
catch(IllegalArgumentException exc){
throw new MyPackageException(exc);
}
}
Чтобы вернуть его к проверенному исключению.
Хорошо, но давайте с этим. Если вы дадите неверный ввод, вы получите ошибку времени выполнения. Итак, во-первых, это на самом деле довольно сложно реализовать единообразно, потому что вам может потребоваться выполнить прямо противоположное преобразование:
public void scanEmail(String emailStr, InputStream mime) {
try {
EmailAddress parsedAddress = EmailUtil.parse(emailStr);
}
catch(ParseException exc){
throw new IllegalArgumentException("bad email", exc);
}
}
И что еще хуже - хотя 0 <= pct && pct <= 100
можно ожидать, что проверка клиентского кода будет выполняться статически, это не так для более сложных данных, таких как адрес электронной почты или, что еще хуже, что-то, что необходимо проверить в базе данных, поэтому в целом клиентский код не может предварительно проверить.
В общем, я хочу сказать, что я не вижу значимой последовательной политики использования IllegalArgumentException
. Похоже, его не следует использовать, и мы должны придерживаться наших собственных проверенных исключений. Какой хороший вариант использования для этого?