try-catch内部或周围的功能&在每次查询执行时是否使用try-catch?

时间:2015-10-26 15:12:48

标签: php function pdo try-catch execute

我已经在stackoverflow上阅读了几个关于这些问题的线程:

  1. 我应该在“查询”内部或周围使用try-catch吗?功能?
  2. 我是否应该在每次执行查询时使用try-catch?
  3. 而且,说实话,我不确定我理解答案 - 有人说是,有人拒绝。所以,我想举例说明我的做法......如果你能给我这两个问题的答案。

    database.php中:

    try {
        $connection= new PDO(DB_DNS, DB_USER, DB_PASS);
        $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch(Exception $e) {
        echo "Error: ".$e->getMessage();
        die();
    }
    

    user.php的:

    class User {
        public function pronadjiSveUsere() {
            global $connection;
            $sql= $connection->prepare("SELECT * FROM users");
            $result = $sql->execute();
            return $result ;
        }
    
        public function find_by_id($id=0) {
            global $connection;
            $sql= $connection->prepare("SELECT * FROM users WHERE id = :id");
            $result = $sql->execute(array($id));
            return $result->fetch(PDO::FETCH_OBJ);   
        }
    }
    

    如您所见 - 类用户有两种方法。我的问题是:

    1。在这些情况下我应该使用try-catch吗?  2.如果答案是肯定的 - 我应该在方法中,例如:

        public function find_by_id($id=0) {
            try {
                global $connection;
                $sql= $connection->prepare("SELECT * FROM users WHERE id = :id");
                $result = $sql->execute(array($id));
                return $result->fetch(PDO::FETCH_OBJ);
            } catch(Exception $e) {
                echo $e->getMessage();
                die();
            }
        }
    

    或周围,只要我使用这些方法,例如

    try {
        user->find_by_id($id);
    } catch(Exception $e) {
        echo $e->getMessage();
        die();
    }
    

    提前谢谢!

2 个答案:

答案 0 :(得分:2)

您可以撰写有关该主题的书籍。事实上,我相信有关此主题的书籍。所以我会保持简短 对于您的所有代码段,我会说不 - 最后一个的可能的例外。
第一个:database.php不应该决定是否继续。所以捕获/死亡块甚至可能被认为是邪恶的。 ESP。无条件打印“真实”错误消息时。某些上层可能想要尝试另一个连接。或打印一位鸽友“对不起,出了点问题。我们正在尽力将yaddayadda带回来”的消息。或者在没有数据库的情况下尽其所能。 (也许这是可能的。如果database.php让php实例死掉的话,那就不是了。) 您的类用户的相同参数。除非有某些东西(智能的),否则用户中的代码可以处理异常,它应该远离处理它。 [打印错误消息+ die 处理异常] 同样,方法本身可以合理地缓解问题是不太可能(尽管不是不可能) - 因此,远离异常;其他一些,上层无论如何都必须处理它。

所以,只有当 能够真正处理它时才处理execpetion 编辑:但有时将一个实际的异常“转换”为上层感兴趣的东西是个好主意。然后你会得到一个不能真正处理异常但是构建一个新异常的catch块(如果可能的话,包括最初的例外)并抛出它。

答案 1 :(得分:1)

如果您需要在每次查询失败时停止应用程序并抛出异常 - 尝试使用php函数set_exception_handler并删除代码中PDO的所有try ... catch块。此函数为所有未捕获的异常注册全局处理程序。但 例如

<?php
    set_exception_handler(function ($e) {
        // Processing only PDOExceptions
        if ($e instanceof PDOException) {
            echo $e->getMessage();
            die();
        } else {
            throw $e;//do not process other exceptions
        }
    });
    ?>

在任何Sql查询之前需要调用此函数。