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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@Perchik:

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

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

Исключительные исключения

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

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

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

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

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

Выполнение в попытке сломается и зацепится в Catch Block.

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

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

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

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

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