Лучшее исключение для броска внутри заданного метода

Если у меня есть метод набора, в котором я хочу изменить некоторые значения, если пользователь вводит неправильные значения, которые являются лучшим исключением для throw, чтобы указать на этот отказ?

public void setSomething(int d) throws ....
{
    if (d < 10 && d >= 0)
    {
        // ok do something
    }
    else throw new ... // throw some exception
}

Ответы

Ответ 1

Я бы пошел на IllegalArgumentException.

Брошенный, чтобы указать, что метод был передан незаконным или несоответствующий аргумент.

ИЗМЕНИТЬ

Другое примечание:

Вместо

if (conditionIsTrue) {
  doThis();
  doThat();
} else { 
  throw new IllegalArgumentException();
}

записи:

if (conditionNotTrue) {
    throw new IllegalArgumentException();
}

doThis();
doThat();

(Хотя этот совет может быть спорным; -)).

Ответ 2

Я согласен с @Code Monkey в создании собственного InvalidArgumentException, но его реализация не показывает всех преимуществ, которые он предоставляет.

1) Вы можете добавить удобные методы для упрощения проверки аргументов. Например:

InvalidArgumentException.throwIfNullOrBlank(someString, "someString");

против.

if (someString == null || someString.trim().isEmpty()) {
    throw new IllegalArgumentException("someString is null or blank");
}

2) Вы можете написать модульные тесты, которые подтверждают, что аргумент недействителен. Если вы выбросите IllegalArgumentException, ваш unit test не сможет подтвердить, что он был брошен по той причине, что вы ожидаете его выброса. Вы даже не можете сказать, что он был брошен вашим собственным кодом.

try {
    someClass.someMethod(someValue);
    Assert.fail("Should have thrown an InvalidArgumentException");
} catch (InvalidArgumentException e) {
    Assert.assertEquals("someValue", e.getArgumentName());
}

3) Вы можете сказать, что исключение было выброшено из вашего собственного кода. (Это незначительная точка, которая не имеет большого практического преимущества)

Ответ 3

Если число является индексом, вы можете использовать IndexOutOfBoundsException. В противном случае, как говорит Оливер, IllegalArgumentException.

Не бойтесь создавать подкласс IllegalArgumentException, чтобы быть более точным о проблеме. Любые блоки catch, написанные для IllegalArgumentException, все равно поймают его, но трассировка стека будет немного более информативной.