程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP中Exception異常處理類的使用詳解

PHP中Exception異常處理類的使用詳解

編輯:關於PHP編程

本文章介紹了在php中常用的簡單的異常處理類,我們主要是講述到了Exception處理 ,有需要了解的同學可參考一下。  代碼如下 復制代碼 <?php
    try {
        $a=10/0;
    }catch (Exception $e){
        echo "拋出異常";
    }
?>

以上代碼,並不會輸出“拋出異常”,而是輸出了錯誤信息:Warning: Division by zero in......

說明:try塊中並沒有拋出異常,而是按照系統默認的錯誤處理機制進行處理

所以能不能捕獲到異常,取決於有沒有真正的拋出異常

 

 代碼如下 復制代碼

<?php
class Exception
{
    protected $message = 'Unknown exception';   // 異常信息
    protected $code = 0;                        // 用戶自定義異常代碼
    protected $file;                            // 發生異常的文件名
    protected $line;                            // 發生異常的代碼行號

    function __construct($message = null, $code = 0);

    final function getMessage();                // 返回異常信息
    final function getCode();                   // 返回異常代碼
    final function getFile();                   // 返回發生異常的文件名
    final function getLine();                   // 返回發生異常的代碼行號
    final function getTrace();                  // backtrace() 數組
    final function getTraceAsString();          // 已格成化成字符串的 getTrace() 信息

    /* 可重載的方法 */
    function __toString();                       // 可輸出的字符串
}
?>

簡單的使用如下:(通過異常,拋出錯誤信息)

 代碼如下 復制代碼

try {
    $error = 'my error!';
    throw new Exception($error)
} catch (Exception $e) {
    echo $e->getMessage();
}

我們可以擴展此類,方便我們的使用

 

 代碼如下 復制代碼

class MyException extends Exception
{
    // 重定義構造器使 message 變為必須被指定的屬性
    public function __construct($message, $code = 0) {
        // 自定義的代碼

        // 確保所有變量都被正確賦值
        parent::__construct($message, $code);
    }

    // 自定義字符串輸出的樣式
    public function __toString() {
        return __CLASS__ . ": [{$this->code}]: {$this->message}n";
    }

    public function customFunction() {
        echo "A Custom function for this type of exceptionn";
    }
}
  

異常處理的基本思想是代碼在try代碼被調用執行。如果try碼塊出現錯誤,我們可以執行一個拋出異常的處理。某些編程語言,如java,,在特定情況下將自動拋出異常。在php中,異常必須手動拋出。可以使用如下方式拋出一個異常:

 代碼如下 復制代碼

  Throw new Exception(‘message’,code);

  Throw 關鍵字將觸發異常處理機制,它是一個語言結構,而不是一個函數,但是必須給它傳遞一個值。它要求一個接受對象。在最簡單的情況下,可以實例化一個內置的Exception類。

  最後,在try代碼之後,必須至少給出一個catch代碼塊。可以將多個catch代碼塊與一個try代碼塊進行關聯。如果每個catch代碼塊可以捕獲一個不同類型的異常,可以使用多個catch代碼塊是有意義的。例如,如果想捕獲Exception類的異常,代碼如下

 

 代碼如下 復制代碼

Catch(Exception $e)

{

   //handing exception

}

Catch代碼捕獲的對象就是導致異常並傳遞給throw語句的對象(被throw 語句拋出)。使用Exception 類的實例,是不錯的選擇。

Exception類提供了如下的內置方法:

  Getcode()      —返回傳遞給構造函數的代碼。

  GetMessage()    —返回傳遞給構造函數的消息。

  getFile()     —返回產生異常代碼的文件的路徑

  getLine()    —返回產生異常的代碼所在的行。
注意:

當捕獲到一個異常後,try()塊裡面的後續代碼將不會繼續執行,而是會嘗試查找匹配的“catch”代碼塊
 當拋出一個異常後,如果不進行catch處理,則會報“Uncaught exception 'Exception'”錯誤

 代碼如下 復制代碼 <?php
    function test($val){
        if ($val>100){
            throw new Exception("提示信息:您輸入的值過大");
        }
    }
    test(111);
?>

  3.當一個異常拋出後,catch語句塊可以進行處理也可以不處理

以下是我用戶注冊功能的部分代碼

try{
     //check forms filled in
     if(!filled_out($_POST)){
         throw new Exception('你還沒有填寫表單,請回去填寫');
     }
     //check email address not valid
     if(!check_email($email)){
        throw new Exception('郵件的格式不正確');
     }
     //檢查密度的長度是否大於6
     if(strlen($passwd<6)){
         throw new Exception('密度的長度應該大於6');
     }
     //檢查兩次密碼是否相等
     if($passwd!=$passwd1){
         throw new Exception('兩次密碼不一樣,請重新輸入');
     }
     //檢查用戶名的長度是否正確
     if(strlen($username)>16){
         throw new Exception('用戶名的長度不符,請重新輸入');
     }
  
 } catch(Exception $e){
     echo $e->getMessage(); //輸出異常信息。
 }

 

php對異常的處理與java一樣,用到的是try{}catch(){}

定義頂級異常處理器用到的函數是
set_exception_handler("My_exception");
這裡的My_expection是開發者自定義的異常處理函數,既頂級異常處理器,只有當程序中沒有函數來處理異常才有頂級異常處理器來處理異常,如果沒有定義頂級異常處理器,則由系統默認的異常處理器來處理異常
舉例說明:

 代碼如下 復制代碼 <meta http-equiv="content-type" content="text/html;charset=utf-8" /><?php
    set_exception_handler("My_expection");
    function My_expection(){
        echo "這裡是頂級異常處理器";
    }
    try{
        nohello("hello");
    }catch(Exception $e){
        throw $e;
    }
  function nohello($nohello){
          if($nohello == "hello"){
              throw new Exception("不能輸入hello");
          }else{
            echo "輸入成功";
        }
    }
?>

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved