簡體   English   中英

PHP嘗試在異常處理中捕獲

[英]PHP Try Catch in Exception Handling

我有一個數據庫類dbconnect.php和processform.php。 在dbconnect.php內部,有一種用於連接數據庫的方法。

如果有錯誤,如何拋出異常? 我在哪里將try catch塊放在processform.php中? 人們說我不應該直接在班級內部回應錯誤。 這是一個例子:

    <?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(), '<br>';
            }
       }
    ?>

    // 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在出現問題時需要引發異常,並且可以在打開數據庫連接時執行此操作:

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

現在您可以將所有內容放入try / catch塊中,但這甚至沒有必要; 如果您不這樣做,當您不手動捕獲它們時,php將向您顯示unhandled exceptions並帶有堆棧跟蹤。

當您決定要為訪問者微調錯誤處理時,可以使用set_exception_handler()設置自己的異常處理程序。 這樣,您可以在一個地方處理所有內容,而不必將不同的部分包裝在try / catch塊中。 您當然應該喜歡那個嗎?

在我的實踐中,我更喜歡將異常排除在底層。 我的意思是,DbConnect中的第二種方式。

您可以將錯誤消息輸出到錯誤日志。 並將錯誤代碼返回到前端。 因此,前端知道如何以友好的方式告訴用戶錯誤的發生。

此外,您可以使用諸如set_error_handler / set_exception_handler類的全局錯誤處理程序來執行此操作。 錯誤發生時重定向到錯誤頁面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM