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


The best practise when to use PHP 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编程在这方面与桌面编程没有什么不同。

异常事件使用异常。对任何期望的内容使用返回值。

我认为看到一个空的查询结果通常不会引发异常。我不会返回任何数据。如果数据库查询以某种方式失败,这将是引发异常的原因。此外,您的异常消息可能应该更具描述性,而不是"您需要修复此问题"。

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

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