Правильный способ обработки исключений

Теперь, что я обычно делаю при написании кода, это что-то вроде этого

function changeBookAuthor(int $id, string $newName){ if(!$newName){ throw new MyAppException('No author name was provided'); } $book = Books::find($id); if(!$book){ throw new MyAppException('The provided book id could not be found'); } } 

в документе laravel мы видим:

https://laravel.com/docs/5.4/errors

 public function report(Exception $exception) { if ($exception instanceof CustomException) { // } return parent::report($exception); } 

Теперь как правильно обработать исключение? все они являются одним и тем же исключением, и у них нет никакого кода. Должен ли я предоставить код ошибки?

проблема с исключением php заключается в том, что они используют целые числа. Довольно раздражает имхо. Лучше было бы 'changeauthor_bookid_notfound' как код вместо случайного числа. Должен ли я создавать класс исключения для каждого отдельного исключения? например, не повторно использовать MyAppException которое кажется немного утомительным. У меня было бы триллион классов.

Теперь, если для специального исключения я хочу специальной обработки, с моим кодом, я не могу легко это сделать. У меня нет кода для проверки (например, $exception->code == 3331 then do special ), и у меня нет настраиваемых классов исключений

что является доказанным хорошим надежным способом справиться с этим делом? код, новый класс при каждой ошибке, что-то еще вместе?

и если предоставить код, что это хороший способ сделать это?