Что такое «блок захвата» в PHP?

#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. повторно представлено -> Когда доктор Дре — ваш адвокат.