InvalidArgumentException vs UnexpectedValueException

Когда следует использовать InvalidArgumentException и когда UnexpectedValueException ? Они выглядят одинаково для меня.

Обратите внимание, что один расширяет LogicException, а другой расширяет исключение RuntimeException, поэтому разница не должна быть такой тонкой IMO.

Внимательно изучая описания страниц руководства:

InvalidArgumentException:

Исключение выбрано, если аргумент не соответствует ожидаемому типу.

(Примечание: «Тип» первоначально был «значением» на странице руководства, что делает его более важным для проверки, чем проверка типов, и более точно соответствует терминологии UnexpectedValueException.)

UnexpectedValueException:

Исключение выбрано, если значение не соответствует набору значений. Обычно это происходит, когда функция вызывает другую функцию и ожидает, что возвращаемое значение будет иметь определенный тип или значение [,], не включая ошибки, связанные с арифметикой или буфером.

Из этого можно сделать вывод, что InvalidArgumentException предназначено для аргументов, переданных функции, а UnexpectedValueException – для значений, возникающих во время внутренних вычислений функции (например, значений, возвращаемых из других функций).

Я понимаю, что InvalidArgumentException , являясь LogicException , следует использовать, если вы проверите аргумент против фиксированного списка возможных диапазонов значений. Например, проверка наличия введенных пользователем данных содержит только числа. Можно ожидать, что программная логика будет обрабатывать эти диапазоны значений.

UnexpectedValueException , являющееся RuntimeException ( ошибки, которые могут быть найдены только во время выполнения / не могут быть обнаружены во время компиляции ), будут использоваться для Исключений, которые происходят за пределами предсказуемых и заданных диапазонов ввода (возможно, в качестве последнего средства после проверки «логики» выше ).

Ключом к ответу на этот вопрос может быть Unexpected... в UnexpectedValueException . Unexpected означает, что для этого значения в логике программы нет обработки. Invalid другой стороны, Invalid указывает, что это значение было обработано.

Я думаю, самая большая разница – это «аргумент» против «значения».

Я вижу, что InvalidArgumentException для аргументов (переданных), тогда как UnexpectedValueException применяется к (возвращенным) значениям . Также есть тонкое, но важное различие между «недействительным» и «неожиданным», что также объясняет, почему первым является LogicException, а второе – исключение RuntimeException.

Например: скажем, у меня есть функция, которая использует Twitter-api: getLastMessageDate($userid) : вы передаете (числовой) идентификатор пользователя и возвращает дату последнего сообщения этого пользователя в виде yyyy-mm- dd string.

Теперь предположим, что я вызываю эту функцию со строкой как аргументом вместо числа. На этом этапе я могу вызвать InvalidArgumentException, потому что предоставленный аргумент недействителен для этой функции. Эти проверки могут выполняться логикой – потому что переменная является либо числовой, либо нет. Поэтому это логическое исключение.

Однако возвращаемое значение функции может не поддаваться проверке по логике – особенно когда вы имеете дело с (сторонним) динамическим контентом. Потому что вы никогда не сможете точно узнать, что ваша функция вернется. (если бы вы это сделали, это, возможно, сделало бы вашу функцию бесполезной.)

Итак, на этот раз я вызываю свою функцию с (действительным) идентификатором пользователя, а моя функция получает дату последнего сообщения этого пользователя. С этой датой я хотел бы что-то сделать, например, в форматировании.

Теперь представьте, что ребята из Twitter сделали что-то не так, и вместо ожидаемой строки даты yyyy-mm-dd я получаю пустую строку или другую строку с надписью «blaaaa». На этом этапе я могу выполнить UnexpectedValueException .

Я не могу сказать, что это значение «Недопустимо» – я попросил строку, и я получил строку. Но это, однако, не «тип строки», который я ожидал: поэтому Unexpected ValueException.

Надеюсь, это что-то прояснит. Это мой первый пост – до сих пор я узнал, что записывать то, что у меня в голове, не самая легкая вещь (также английский не мой родной язык).