Как использовать блок try-catch для PDO - PullRequest
3 голосов
/ 13 февраля 2012

Как правильно обрабатывать ошибку PDO при использовании блока try catch?

В настоящее время у меня есть что-то вроде этого:

BlogModel.php

   class BlogModel extends Model {
       public function save($id, $value) {
         $stmt = $this->getDb()->prepare('UPDATE setting SET name = :name WHERE id = :id');
         $stmt->bindParam(':id', $id);
         $stmt->bindParam(':name', $values);
         return ($stmt->execute() !== false) ? $id : false;
       }
   }

Итак, в контроллере BlogController.php я бы сделал что-то вроде этого:

<?php
class Blog extends Controller {

    public function comments()
    {
        $data = array();
        $model = new BlogModel;

        if ($model->save(2,'test')) {
                $data['result']['message'] = 'Settings saved';
                $data['result']['status'] = 'success';
        } else {
                $data['result']['message'] = 'Could not save the settings';
                $data['result']['status'] = 'error';
        }

        $view = new View("view.php", $data)
        $view->render();
    }
}
?>

Это способ обработки ошибки PDO с использованием условий if. Как можно перевести это в блок try try? Я не хочу все время кодировать переменные ($data['result']['message'] $data['result']['status']).

Можно ли как-нибудь добавить "исключение выброса" в блок catch?

Если в контроллере много блоков try catch, он будет выглядеть грязно .. верно?

Ответы [ 3 ]

3 голосов
/ 13 февраля 2012

Рассматривали ли вы возможность самому PDO генерировать исключения вместо ошибок?

$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

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

В остальном просто используйте Try / Catch где-то высоко в вашем внешнем контроллере, чтобы поймать действительно исключительные исключения.

Единственное отличие в моем подходе в том, что в BlogModel вы просто:

$stmt->execute();

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

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

3 голосов
/ 13 февраля 2012

Ни один из ответов здесь не верен.Но на самом деле все три вместе взятые являются реальным ответом.Вы должны определенно установить

$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

, как сказано Cerad .

С этого момента каждый отдельный вопрос о базе данных генерируется через исключение типа PDOException.Вам просто не нужно бросать свои Exception, как сказал ladar , потому что это бесполезно.Просто возьмите код ladar и преобразуйте его в

 ...
 $data = array();
 $model = new BlogModel;

    try{
      $model->save(2,'test');
      $data['result']['message'] = 'Settings saved';
      $data['result']['status'] = 'success';
    }catch(PDOException $e){
        $data['result']['message'] = 'Could not save the settings';
        $data['result']['status'] = 'error';
    }

И НЕ бросайте ничего самостоятельно.

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

Объединяя эти вещи вместе, вы получите гибкий, чистый и простой в отладке способ отловавсе ошибки, которые могут прийти.

3 голосов
/ 13 февраля 2012

А как же:

class BlogModel extends Model {
   public function save($id, $value) {
   ...
   if (!$stmt->execute()) {
        throw new Exception($stmt->errorInfo());
    }
   return $id;

А потом

 ...
 $data = array();
 $model = new BlogModel;

    try{
      $model->save(2,'test');
      $data['result']['message'] = 'Settings saved';
      $data['result']['status'] = 'success';
    }catch(Exception $e){
        $data['result']['message'] = 'Could not save the settings';
        $data['result']['status'] = 'error';
    }
...