В чем преимущество использования try {} catch {} по сравнению с if {} else {} - PullRequest
55 голосов
/ 16 марта 2009

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

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

Ответы [ 12 ]

52 голосов
/ 16 марта 2009

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

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

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

15 голосов
/ 16 марта 2009

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

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

7 голосов
/ 16 марта 2009

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

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

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

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

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

7 голосов
/ 16 марта 2009

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

6 голосов
/ 16 марта 2009

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

5 голосов
/ 16 марта 2009

@ Перчик:

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

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

Исключения Vexing

5 голосов
/ 16 марта 2009

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

3 голосов
/ 16 марта 2009

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

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

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

2 голосов
/ 11 ноября 2017

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

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

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

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

Так что затраты на возврат булевских вейлов и их проверку меньше.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...