自定义PDO错误尝试/捕获

时间:2013-11-06 20:07:30

标签: php mysql pdo error-handling

目前,当我的SQL出错时,它会抛出如下所示的传统错误:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax...|

我知道我可以通过在try / catch块中包装每个SQL例程来实现我想要的东西,但这似乎有点长篇大论:

class ProductsModel extends Model {

  function __construct()
  {
    parent::__construct();
  }

 public function setName($name, $productId)
  {
    $SQL = 'UPDATE products SET name = ? WHERE id = ?';
    try{
    $r = $this->db->prepare($SQL);
    $r->execute(array($name, $productId));
    }catch(PDOException $e) {
      echo 'Error!';
    }
  }
}

有没有办法让所有SQL查询自动完成?

3 个答案:

答案 0 :(得分:8)

是的,不,你不应该这样做。

与catch块。即:

try {
    $productsModel->setName("name", 42);
}
catch (PDOException $e) {
    //Do something, 500 error code, whatever
}

那是因为,只有在您尝试访问数据库时才知道您想要做什么,以防它失败

此:

  • 使方法更清晰,方法内部不需要进行错误处理。
  • 为您提供灵活性。在某些时候,如果失败,您可能想要抛出500错误,在另一个点上,您可能希望将JSON对象返回到AJAX调用。

答案 1 :(得分:4)

您可以设置exception handler

<?php
function exception_handler($exception) {
  echo "Uncaught exception: " , $exception->getMessage(), "\n";
}

set_exception_handler('exception_handler');

throw new Exception('Uncaught Exception');
echo "Not Executed\n";
?>

它将捕获所有异常类型,而不仅仅是PDOExceptions。如果您想专门处理所有PDOExceptions,可以这样检查:

function exception_handler($exception) {
   if ($exception instanceof PDOException) {
       echo 'This is a PDOException';
   }
}

答案 2 :(得分:-1)

实现自己的类PDO类:

class MYPDO extends PDO {
  public function query() {
    try {
      call_user_func_array(array($this, 'parent::query'), func_get_args());
    }catch(PDOException $e) {
      echo 'Error!';
    }
  }
}

$db = new MYPDO(...);
$db->query(...);