Лучшее исключение, чтобы бросить внутри метода набора - PullRequest
18 голосов
/ 07 сентября 2011

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

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

Ответы [ 3 ]

38 голосов
/ 07 сентября 2011

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

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

EDIT

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

Вместо

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

запись:

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

doThis();
doThat();

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

10 голосов
/ 07 сентября 2011

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

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

InvalidArgumentException.throwIfNullOrBlank(someString, "someString");

против

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

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

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

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

5 голосов
/ 07 сентября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...