Я согласен с @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) Вы можете сказать, что исключение было выдано из вашего собственного кода. (Это незначительный момент, который не имеет большого практического преимущества)