В каких случаях следует делать кастомные Exceptions?
Собственные исключения необходимы в случаях, когда вы хотите обрабатывать (или, в случае если вы автор библиотеки - предоставить возможности обработки) какой-либо исключительный сценарий специальным образом. К примеру посмотрите, как организована работа с exceptions в Doctrine.

Также собственные исключения могут пригодится в случае, если вы хотите передавать с этим исключением какую-то дополнительную информацию. К примеру посмотрите на exceptions для ответов разных HTTP статусов в Symfony.
Мы делаем кастомные исключения во всех случаях. Просто для читабельности, передачи контекста, исключения дебатов во время код-ревью - делать кастомное исключение или нет, и т.д.