За последние 24 часа нас посетили 23355 программистов и 1514 роботов. Сейчас ищут 811 программистов ...

Best practice исключений

Тема в разделе "PHP для новичков", создана пользователем machetero, 17 апр 2016.

  1. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Как правило исключения надо кидать, когда программа не в силах корректно отработать ? Например вдруг не загрузился класс Request ?
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Вроде того. Исключения можно использовать для гибкого управления состояниями программы. Например, у тебя есть метод который ищет пользователя в таблице. Корректный результат - массив/объект соответствующей записи этого юзера в субд. А что ты вернешь, если что-то пошло не так?

    Упал сервер субд.
    Неверный логин-пароль.
    Верный логин-пароль но лимит соединений.
    Успешное подключение но нет такой базы.
    Есть такая база но нет такой таблицы.
    Есть такая таблица/база но нет права чтения данных.
    Есть таблица и права но структура таблицы не соответствует используемой в запросе.
    Ну и наконец самое банальное - тупо нет такого пользователя.
    Или еще можно дополнительно фильтрацию входных данных сделать и тогда кидать что-то типа: в логине могут быть только латинские буквы и цифры.

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

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Ganzal благодарю за разъяснения )