PHP尝试在异常处理中捕获

PHP Try Catch in Exception Handling

我有一个数据库类dbconnect.php和processform.php。在dbconnect.php内部有一个连接到数据库的方法。

如果有错误,如何抛出异常?在processform.php中,我应该把try-catch块放在哪里?人们说我不应该在课堂上直接回送错误。下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    <?php

    // dbconnect.php

    class DbConnect
    {

        public function open_connection()
        {

            /* Should I do it like this? */
            $this->conn = PDO($dsn, $this->username, $this->password);
            if (!$this->conn) {
                throw new Exception('Error connecting to the database.');
            }

            /* Or like this */
            try {
                $this->conn = PDO($dsn, $this->username, $this->password);
            } catch (PDOException $e) {
                echo 'Error: ', $e->getMessage(), '';
            }
       }
    ?>

    // processform.php

    <?php
        require_once 'dbconnect.php';
        $pdo = new DbConnect($host, $username, $password);
        try {
            $pdo->open_connection();
        } catch (PDOException $e) {
            echo 'Error connecting to the database.');
        }
    ?>

我真的想学习在代码中实现try-catch的正确方法。


您不必手动引发异常,尤其是在成功连接时:-)

相反,您需要告诉PDO,当出现问题时它需要抛出异常,并且您可以在打开数据库连接时这样做:

1
2
$options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
$this->conn = new PDO($dsn, $this->username, $this->password, $options);

现在,您可以将所有内容放在trycatch块中,但这甚至不是必需的;如果不这样做,当您不手动捕获它们时,php将向您显示unhandled exceptions完成堆栈跟踪。

当您决定为访问者微调错误处理时,可以使用set_exception_handler()设置自己的异常处理程序。这样,您就可以在一个地方处理所有内容,而不必在try/catch块中包装不同的部分。当然,你更喜欢这个吗?


在我的实践中,我更喜欢在底部捕获异常。我是说,在你的数据库连接中。

您可以将错误消息输出到错误日志。并将错误代码返回到前端。所以前端知道如何友好地告诉用户发生的错误。

此外,您可以使用全局错误处理程序(如set_error_handler/set_exception_handler)来执行此操作。出现错误时重定向到错误页。