何时使用PHP异常处理的最佳实践

时间:2012-03-27 21:35:06

标签: php exception exception-handling

我知道在问号之前已经问过这个问题,但它们似乎有桌面应用程序背景而不是Web应用程序。我目前正在使用PHP构建Web应用程序。我将使用控制器和模型文件来演示我的问题。

控制器文件

此文件调用数据库来查询和获取数据

<?php public function index() {
    $this->database->query("SELECT user_name, FROM test WHERE user_name = :user_name");
    $this->database->execute_query("jim");
    $this->view->data = $this->database->fetch_query();
?>

数据库文件

<?php

class DB {

    private $datasourcename;
    private $user;
    private $password;
    private $connection;
    private $prepare;
    private $query;

    function __construct($dsn, $user, $password) {

        $this->datasourcename = $dsn;
        $this->user = $user;
        $this->password = $password;    

        $this->connection = new PDO($this->datasourcename, $this->user, $this->password);
    }

    public function query($query) {

        $this->query = $query;
        try {
            if (empty($query)) {

                throw new Exception("The query is empty");
                return false;
            }
        } catch (Exception $e) {
            echo 'Caught exception: ', $e->getMessage(), "<br/>";
        }
        if (strstr($query, ":") == FALSE) {
            return $this->connection->query($query);
        } else {

            $this->prepare = $this->connection->prepare($query);
        }
    }

    public function execute_query($valarg = array()) {

        try {
            if (empty($valarg)) {

                throw new Exception("There are no values in the execute query function");
                return false;
            }
            if (is_array($valarg) == false) {

                throw new Exception("The values inserted are not in an array");
                return false;
            } else {

                $query = $this->query;
                $paramkeys = array();
                $paramArr = array();

                if (strstr($query, ":")) {    

                    preg_match_all("/:(\w+)/", $query, $paramkeys);

                    $paramArr = array_combine($paramkeys[0], $valarg);

                    $this->prepare->execute($paramArr);
                }
            }
        } catch (Exception $e) {
            echo 'Caught exception: ', $e->getMessage(), "<br/>";
        }
    }

    public function fetch_query() {

        try {
            if($this->execute_query() == false)    {

                 throw new Exception("Sorry you need to fix this first");
            }

             if($this->query() == false)    {

                 throw new Exception("Sorry you need to fix this first");
            }
            else    {

                 $result = $this->prepare->fetch(PDO::FETCH_ASSOC);

                return $result;
            }
        }
        catch (Exception $e) {
            echo 'Caught exception: ', $e->getMessage(), "<br/>";
        }
    }
}

?>

我在数据库类中使用异常处理作为开发人员正确使用该类提供的函数以使应用程序正常工作的一种方式,我是否认为这是使用它们的最佳实践?在何时以及如何使用它们时是否有明确的最佳实践?我在这个网站上已经阅读了类似的问题,但背景是桌面应用程序设计,而不是Web应用程序。

1 个答案:

答案 0 :(得分:6)

在这方面,Web编程与桌面编程没有什么不同。

例外事件使用例外。对任何预期的事物使用返回值。

我认为看到一个空的查询结果通常不会引发异常。我只是没有返回任何数据。如果数据库查询以某种方式失败,那将是抛出异常的原因。此外,您的异常消息应该更具描述性,而不是“您需要解决此问题”。

最后,在PHP 5.3中,您可以通过将其作为Exception构造函数中的第三个参数传递来设置内部异常。

http://www.php.net/manual/en/class.exception.php