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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

@Perchik:

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

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

Излучения exex

Ответ 9

У всех других были хорошие ответы, но я подумал, что я брошу свою собственную:

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

Ответ 10

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

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

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

Выполнение в try будет ломаться и зацепиться в блоке Catch.

Итак, для возврата значений bool осталось меньше накладных расходов.

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

Ответ 11

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

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

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