#java #php #class
#java #php #класс
Вопрос:
Я время от времени встречал подобный код в PHP, и мне было интересно, что все это значит.
$pdo = new PDO ($connect_string, $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$pdo->exec ("QUERY WITH SYNTAX ERROR");
}
catch (PDOException $e) {
echo $e->getMessage();
}
Что меня интересует, так это catch (PDOException $e)
код в целом.
Я создаю var_dump исключение, и оно возвращает класс PDOException ( doh.. логично ). Но это не проясняет ситуацию, в чем идея этого метода, почему он используется и как он называется 🙂
Я также видел эту технику в программировании на Java, но, к сожалению, я не очень хорошо знаю Java… :/
Комментарии:
1. PDO настраивается в этом отношении. Вы также можете заставить его выдавать сообщения об ошибках oldschool PHP вместо этого, если установлено значение
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
. Просто исключения и try / catch предпочтительнее для критически важных для бизнеса данных, а предупреждения больше предназначены для переноса старых кодовых баз. (Хотя это вполне жизнеспособно для простоты.)
Ответ №1:
Это обработчик исключений для обработки исключений, которые были сгенерированы $pdo->exec()
.
При выполнении $pdo->exec()
могут возникнуть возможные исключения (код не должен функционировать должным образом), и они выдаются (с throw new PDOException('error!')
или похожими). Они будут выброшены до первого catch их определенного типа.
В приведенном выше примере ваш catch() { ... }
блок будет перехватывать исключения из PDOException
. Если у вас не было этого блока, он всплывет для любых других обработчиков исключений, и если его не обработать, произойдет сбой вашего приложения. Вы увидите некоторые приложения, в которых try{ ... }/catch(){ ... }
блок обертывает их основной запрос, поэтому необработанные исключения будут всплывать вплоть до него (и обрабатываться).
Если вам нужен код очистки или любой другой код, который необходимо запустить в случае перехвата исключения, вы могли бы использовать finally { ... }
(но PHP на данном этапе его не поддерживает).
Если вы хотите изменить поведение обработчика исключений, вы можете использовать set_exception_handler()
.
Комментарии:
1. Хорошо, это немного проясняет ситуацию. Я видел это также в других кодах, подобных этому
abstract class phpDataMapper_Adapter_PDO { public function read(phpDataMapper_Query $query) }
. Есть идеи, что это вообще такое?2. В некотором роде согласен с вами, за исключением того, что исключения не следует рассматривать как неустранимые ошибки . Они являются исключениями, и их следует вызывать при возникновении исключительной ситуации. Исключения могут быть фатальными , даже если они перехвачены.
3. @netcoder Хорошо, я согласен, я пытался провести аналогию, но потерпел неудачу. Я изменил его, как вы думаете, теперь это имеет какой-то смысл? 🙂
4. @The Devil: Посмотри в руководстве по PHP . Или отправьте другой вопрос (пожалуйста, сначала прочтите руководство!).
Ответ №2:
Это механизм обработки ошибок. Если что-то идет не так, генерируется исключение (в этом случае класс исключения называется PDOException), и в catch
части кода вы имеете дело с сообщением об ошибке и возможной очисткой беспорядка, который мог возникнуть в try
блоке.
Ответ №3:
вы определенно должны что-то знать об ООП 🙂
Это объектно-ориентированный способ управления ошибками: в PHP (как и в Java) непредвиденные ситуации (например, ошибки) являются объектами, точно так же, как и все остальное. Когда вызов метода (назовите его methodA() ) вызывает какую-то неожиданную ситуацию, вместо возврата false или просто завершения работы программы возникает «исключение». Это означает, что метод прерывается, поток программы передается методу / функции, который вызвал метод «methodA()», у которого есть два варианта: сам создавать исключение или управлять им. Эта ключевая схема catch обозначает второй способ: когда вы пишете какой-либо код, который, возможно, может вызвать неожиданное поведение, вы можете окружить этот код блоком «try-catch», точно так же, как в примере выше: если вызов метода вызывает объект исключения (типа внутри предложения catch), весь оставшийся код в блоке «try» будет пропущен, а код в блоке «catch» будет выполнен. Оставшийся код будет выполнен в обычном режиме.
Если вы не перехватываете исключение, вы можете работать в другом режиме: в PHP это зависит от вашего файла php.ini, в JAVA это приводит к завершению программы, в jsp исключение отображается на экране и так далее. На самом деле, в производственном приложении вы ВСЕГДА должны перехватывать исключения, когда они могут быть выданы, если вы не абсолютно уверены, что исключение не будет вызвано.
просто в качестве отправной точки взгляните на это: http://php.net/manual/en/language.exceptions.php
Комментарии:
1. повторно представлено -> Когда доктор Дре — ваш адвокат.