В чем преимущество использования try {} catch {} по сравнению с if {} else {}

StackOverflow https://stackoverflow.com/questions/651619

  •  19-08-2019
  •  | 
  •  

Вопрос

Я переключаюсь с обычного mysql в php на PDO, и я заметил, что распространенным способом проверки на наличие ошибок является использование комбинации try / catch вместо комбинаций if / else.

В чем преимущество этого метода, могу ли я использовать один блок try / catch вместо нескольких вложенных блоков if / else для обработки всех ошибок на разных этапах (подключение, подготовка, выполнение и т.д.)?

Это было полезно?

Решение

Я бы использовал блок try / catch, когда обычный путь по коду должен проходить без ошибок, если нет действительно каких-то исключительных условий - например, не работает сервер, истек срок действия ваших учетных данных или они неверны. Я бы не стал использовать его для обработки неисключительных ошибок, например, если текущий пользователь не в нужной роли. То есть, когда вы можете разумно ожидать и обрабатывать ошибку, которая не является исключительным условием, я думаю, что вы должны выполнить свои проверки.

В случае, который вы описали - настройка и выполнение запроса, блок try / catch является отличным способом справиться с ним, поскольку вы обычно ожидаете, что запрос будет выполнен успешно. С другой стороны, вы, вероятно, захотите проверить, что содержимое результата соответствует логике потока управления, а не пытаться использовать данные, которые могут быть недопустимыми для ваших целей.

Одна вещь, на которую вы хотите обратить внимание - небрежное использование try / catch. Try / catch не должен использоваться, чтобы защитить себя от плохого программирования - "&; Я не знаю, что произойдет, если я сделаю это, поэтому я собираюсь обернуть его в попытку / ловить и надеюсь на лучший & вид программирования. Как правило, вы хотите ограничить типы исключений, которые вы ловите, теми, которые не связаны с самим кодом (сбой сервера, неверные учетные данные и т. Д.), Чтобы вы могли находить и исправлять ошибки, связанные с кодом (нулевые указатели и т. Д.). .).

Другие советы

В общем, блоки try-catch хороши, потому что они будут прерываться (переходить к оператору catch) всякий раз, когда возникает исключение.Блоки If-else полагаются на то, что вы предсказываете, когда произойдет ошибка.

Редактировать:Кроме того, блоки catch не остановят ваш код при обнаружении ошибки.

Преимущество try / catch и исключений в целом больше для людей, разрабатывающих библиотеки, такие как PDO. Они позволяют разработчику системы быстро и легко обрабатывать неопределенные ситуации или неожиданные результаты. Возьмите соединение с базой данных. Что должна сделать система, если база данных недоступна. Должно ли это остановить исполнение? Попробуйте снова? Выкинуть предупреждение и продолжить? Разработчик системы не может знать, что вам нужно для этого, он выдает исключение, которое вы позже поймаете и обработаете.

Для вас, как потребителя системы, преимущество заключается не в том, чтобы получить какой-либо расплывчатый код ошибки или простое логическое ложное значение в случае сбоя, вы получаете объект Exception, который будет

<Ол>
  • Именуйте так, чтобы было более очевидно, что пошло не так (если я правильно помню, PDO имеет только один тип исключения, но другие системы содержат несколько типов исключений для разных типов ошибок)

  • Май / должен содержать методы и свойства, которые помогут вам выяснить, почему возникло исключение

  • В любом случае, это теория. Есть много умных людей, которые утверждают, что исключения - это путь. Есть также много умных людей, которые думают, что исключения - это дьявол и опора для ленивых разработчиков систем. Нет ничего похожего на консенсус по этому вопросу.

    Try / Catch полностью отделяет логику обработки ошибок от бизнес-логики объекта.

    Создание и перехват исключения - дорогостоящая операция по сравнению с большинством других примитивных операций. Если это кусок кода, который должен работать хорошо (например, в тесном цикле), вам нужно рассмотреть ваш вариант использования - если вы ожидаете, что исключения будут генерироваться относительно часто, вам будет лучше, если / else perforance-wise (если только базовый код просто не создает для вас исключение, в этом случае никакого выигрыша нет вообще). Если исключения генерируются только в редких случаях, тогда лучше использовать try / catch, чтобы избежать издержек ветвления в узком цикле.

    @Perchik @Перчик:

    Моя общая философия обработки ошибок:

    Ты следует используйте if / else для обработки всех ожидаемых случаев.Ты должен нет используйте try {} catch {} для обработки все (в большинстве случаев) потому что может быть вызвано полезное исключение, и из него вы можете узнать о наличии ошибки.Ты следует используйте try {} catch {} в ситуациях, когда вы подозреваете, что что-то может / пойдет не так, и вы не хотите, чтобы это привело к сбою всей системы, например, тайм-аут сети / проблемы с доступом к файловой системе, файлы не существуют и т.д.

    Досадные исключения

    Это & # 8217; это именно то преимущество, что вместо одного оператора if используется одна команда try / catch. Вы также сможете обнаружить любые непредвиденные ошибки.

    Поскольку PDO использует объекты, они вызывают исключения в случае возникновения ошибки. Старые mysql / mysqli были просто функциями и не создавали исключений, они просто возвращали коды ошибок. Try / catch используется, когда из кода может быть сгенерировано исключение, и вы ловите его в предложении catch, которое является объектно-ориентированным способом обработки ошибок. Вы не можете перехватывать исключения с помощью блоков if / else - они ничего не делят с try / catch.

    У всех остальных были хорошие ответы - но я решил, что я добавлю свои:

    <Ол>
  • Try / Catch - это реальный механизм обработки исключений, поэтому, если вы измените ваши исключения, он будет автоматически работать со всеми операторами try / catch.
  • Try / Catch дает возможность запускать код даже в случае серьезного исключения, которое может уничтожить if / else, и, кроме того, оператор try можно откатить (если вы разбираетесь в этом).
  • В php с помощью Try Catch с наследованием мы можем выбросить исключение из другого класса.

    Пример: - Я нахожусь в controller и проверяю данные пользователя с помощью Models.

    Если возникает какая-либо ошибка, мне просто нужно вызвать исключение из Model методов.

    Выполнение в try будет прервано и заблокировано в Catch блоке.

    Таким образом, затраты на возврат bool-вейлов и их проверку уменьшаются.

    Помимо этого Try Catch отлично работает при использовании в цепочке (Try - Catch внутри другого <=>).

    Полностью согласен с @Jared Updike

    Обычно обработка исключений выполняется при том, что пользователь мало или вообще ничего об этом не знает.С другой стороны, пользователь системы знает о том, что происходит внутри блока if-else.

    например.Это должно быть предложение "else", которое показывает пользователю банкомата сообщение "Недостаточный банковский баланс", когда у него низкий баланс.И это сообщение НИ по какой причине НЕ МОЖЕТ находиться внутри блока "catch"!!

    Допустим, мы пишем код деления a / b, и произошел самый известный случай исключения, т. е. ошибка деления 0, как вы думаете, что можно сделать дальше?  1. Вы можете распечатать сообщение и выйти.  2. Вы можете распечатать сообщение и позволить пользователю повторно ввести значения и т. Д.

    Бывают случаи, когда разные люди / поставщики хотят обрабатывать одно и то же исключение по-разному. Блок catch позволяет им сделать это с легкостью. Если вам нужно изменить способ обработки определенного случая исключения, вам просто нужно изменить блок catch.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top