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


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

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

11 51

11 ответов:

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

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

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

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

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

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

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

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

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

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

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

Это именно то преимущество, используя один try/catch вместо нескольких операторов if. Вы также сможете поймать любые непредвиденные ошибки.

@Perchik:

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

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

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

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

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

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

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

в php с помощью Try Catch с наследованием мы можем выбросить исключение из другого класса.

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

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

исполнение в try будет сломано и поймано в Catch заблокировать.

таким образом, меньше накладных расходов на возврат bool vales и проверку этого.

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

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

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

например. Это должно быть предложение" else", которое показывает пользователю банкомата сообщение" недостаточный банковский баланс", когда его баланс низкий. И это сообщение не может сидеть внутри блока "catch" по какой-либо причине !!