Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: PDOException, RuntimeException, Exception в чем разница?
Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014
Помог: 0 раз(а)
Согласно документации PDOException это наследник RuntimeException, а последний в свою очередь наследник Exception.
Из документации:
Цитата:
Метод PDO::__construct() будет всегда бросать исключение PDOException, если соединение оборвалось, независимо от установленного значения PDO::ATTR_ERRMODE
1) Спрашивается нафига, тогда нужно указывать:
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) ?
2) Зачем указывать конкретику, что это PDO - catch (PDOException $e), если я могу написать так - (Exception $e) или так (RuntimeException $e) и получаю ту же самую перехваченную ошибку.
В чем смысл одинаковых трех классов, если они делают одно и тоже?
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
1) PDO::ATTR_ERRMODE задаёт поведение для дальнейших запросов.
__construct всегда исключение бросает в случае чего, а те же execute и query - уже в зависимости от ERRMODE
2) Разница в том, exception - это все возможные исключения (до 7.0.0, в 7.0.0 немного поменяли), RuntimeException - исключения, обнаруженные при выполнении кода (не обязательно базы), PDOException - именно ошибки базы.
Даёт возможность в конкретном catch ловить именно какое-то конкретное подмножество исключений.
Если указывать надмножество - то, конечно, вы будете ловить все исключения этого множества. А вот если у вас указан PDOException, а произошёл какой-нибудь LogicException - сюда он не попадёт.
// транзакцию откатим, а вот ошибку передадим дальше
$pdo->rollback();
throw $e;
}
arimanecro пишет:
если при создании new PDO, у меня стоит перехватчик?
А тут-то не стоит. Почему ошибка должна перехватываться в какой-то другой try?
----- PostgreSQL DBA
arimanecro
Отправлено: 08 Декабря, 2015 - 12:33:59
Частый гость
Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014
Помог: 0 раз(а)
спс, за развернутый ответ.
Мелкий пишет:
А тут-то не стоит. Почему ошибка должна перехватываться в какой-то другой try?
хм, тогда получается, что любой запрос осуществляющийся с помощью ПДО, нужно постоянно ставить в try/catch ?
Др.словами, если ф-ия (например test) использует подключение ПДО из класса Db и внутри этой функции, ошибочный запрос, получается что ПДО-исключение выкидывается внутрь ф-ии test, а не к себе в класс Db?
Мелкий
Отправлено: 08 Декабря, 2015 - 12:49:16
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Для типичной политики обработки веб-запроса при получении ошибки запроса обычно лучшее что можно сделать - это быстренько свернуть всю работу, записать информацию в лог и показать пользователю красивую страницу ошибки.
Это всё-таки исключение, нетипичное поведение приложения.
И для этой типичной политики делается один корневой try, которым обёрнут практически весь проект. Он и будет ловить и ошибки подключения PDO, и ошибки запросов и всякие datetime, simplexml и что там ещё даже в нативном php5.x кидает исключения.
Практически все фреймворки через set_error_handler преобразуют все предупреждения кода в исключения.
Так что этот единственный catch отлавливает очень много чего происходящего в коде.
И только если вы хотите сделать какую-то отличающуюся обработку ошибок для отдельного фрагмента кода - то тогда этот кусок кода оборачиваете в свой отдельный try и пишется отдельная обработка.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.