2014-10-11 149 views
0

我有一個數據庫類dbconnect.php和processform.php。在dbconnect.php裏面有一個連接數據庫的方法。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的正確方法。

回答

1

您不必手動拋出一個異常,尤其是在成功連接:-)

相反,你需要告訴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區塊中包裝不同的部分。你當然喜歡那個。

0

在我的實踐中,我更喜歡在底部捕捉異常。我的意思是,第二種方式在你的DbConnect。

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

更重要的是,您可以使用全局錯誤處理程序(例如set_error_handler/set_exception_handler)來執行此操作。錯誤發生時重定向到錯誤頁面。