Как правило исключения надо кидать, когда программа не в силах корректно отработать ? Например вдруг не загрузился класс Request ?
Вроде того. Исключения можно использовать для гибкого управления состояниями программы. Например, у тебя есть метод который ищет пользователя в таблице. Корректный результат - массив/объект соответствующей записи этого юзера в субд. А что ты вернешь, если что-то пошло не так? Упал сервер субд. Неверный логин-пароль. Верный логин-пароль но лимит соединений. Успешное подключение но нет такой базы. Есть такая база но нет такой таблицы. Есть такая таблица/база но нет права чтения данных. Есть таблица и права но структура таблицы не соответствует используемой в запросе. Ну и наконец самое банальное - тупо нет такого пользователя. Или еще можно дополнительно фильтрацию входных данных сделать и тогда кидать что-то типа: в логине могут быть только латинские буквы и цифры. Вот я сейчас нафантазировал десяток различных ситуаций, выходящих за рамки простого "возвращения данных о пользователе". Как в этом случае можно извратиться без использования исключений? Можешь возвращать коды ответов и потом через свич их обрабатывать. Просто, но код будет убогим. Плюс надо помнить чему равны сами коды и не ошибаться при их возврате и разборе. А как запихнуть дополнительные данные в ответ? Кидать массив или объект? Исключения как раз ко второму случаю и относятся. Кидается объект какого-то класса, производного от класса исключения. Кидается всегда в сторону выхода из главного main(). Вот тут и гибкость проявляется: "потерянного пользователя" ты можешь обработать в том методе, из которого искал, а ошибки БД - где-то выше в стеке. Отличать можешь как раз по классу, объектом которого является конкретный инстанс исключения. В приведенном примере почти все исключения будут к примеру mysqli_sql_exception (если ты им пользуешься), а последние два - какого-нибудь UserNotFoundException и InvalidUsernameCharactersException. Если кусок кода на котором висит ловушка будет выполнен корректно - всё ок. Если прикрытый код бросит исключение - ты можешь рассмотреть необходимое кол-во алгоритмов ответа на эти исключения. В том числе и повторить выброс этого же исключения или выбросить другое исключение и повторно обработать исключение выше в стеке. Или не обработать и дать ему уронить пхп-машину. А еще вне зависимости от того было исключение или нет - ты можешь дополнительно выполнить еще какой-то фрагмент кода. Я честно не представляю насколько уродским будет нагромождение свичей и ифов, если попытаться решить это же, но без использования механизма исключений.