Хорошая ли практика создавать свои классы Exception для отлавливания разных ошибок?
Практика хорошая. Именно так и стоит делать. В идеале у каждой ошибки должен быть свой уникальный эксепшн. Например, от FileException можно наследовать например NotFoundFileException и AccessFileException. При этом тело классов в большинстве случаев будет пустым.
А вот то, что ты пытаешься поймать все возможные эксапшны в контроллере - это совсем не хорошо. По хорошему нужен отдельный эксепшн хендлер для этого.
Имеет смысл, например, для внутренних эксепшенов в библиотеках. 
Потому что библиотека используется как черный ящик.