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