PHP 物件導向程式設計(oop)學習筆記 (四) - 異常處理類Exception_php執行個體

來源:互聯網
上載者:User

使用異常

PHP5 增加了類似其他語言的異常處理模組。在PHP代碼中所產生的異常可被 throw 語句拋出並被 catch 語句捕獲。需要進行異常處理的代碼都必須放入到 try 代碼塊內,以便捕獲可能存在的異常。每個try至少對應一個 catch 塊。使用多個 catch 可以捕獲不同的類所產生的異常。當 try 代碼塊不再拋出異常或者找不到 catch 能匹配所拋出的異常時,PHP 代碼就會在跳轉到最後一個 catch 的後面繼續執行。當然,PHP 允許在 catch 代碼塊內再次拋出(throw)異常。

預定義異常 Exception

Exception 類是所有異常的基類,我們可以通過派生 Exception 類來達到自訂異常的目的。下面的清單列出了 Exception 的基本資料。

複製代碼 代碼如下:

Exception {
    /* 屬性 */
    protected string $message ;        //異常訊息內容
    protected int $code ;            //異常代碼
    protected string $file ;        //拋出異常的檔案名稱
    protected int $line ;            //拋出異常在該檔案中的行號
    /* 方法 */
    public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]] )    //異常建構函式
    final public string getMessage ( void )            //擷取異常訊息內容
    final public Exception getPrevious ( void )        //返回異常鏈中的前一個異常
    final public int getCode ( void )                //擷取異常代碼
    final public string getFile ( void )            //擷取發生異常的程式檔案名稱
    final public int getLine ( void )                //擷取發生異常的代碼在檔案中的行號
    final public array getTrace ( void )            //擷取異常追蹤資訊
    final public string getTraceAsString ( void )    //擷取字串類型的異常追蹤資訊
    public string __toString ( void )                //將異常對象轉換為字串
    final private void __clone ( void )                //異常複製
}

瞭解完 Exception 後,我們來嘗試擴充 exception 類來實現一個自訂異常。

複製代碼 代碼如下:

function connectToDatabase()
{   
    if(!$link = mysql_connect("myhost","myuser","mypassw","mybd"))
    {
        throw new Exception("could not connect to the database.");
    }
}
try
{
    connectToDatabase();
}
catch(Exception $e)
{echo $e->getMessage();
}

這裡我們拋出類一個 Exception 類型的異常,並在catch裡捕獲了這個異常,最終列印出了“could not connect to the database.”。或許你想還想顯示資料庫連接失敗的原因資訊。下面及通過擴充exception類來實現我們的自訂資訊。

複製代碼 代碼如下:

class MyException extends Exception
{
    protected $ErrorInfo;
    //構造函裡處理一些邏輯,然後將一些資訊傳遞給基類
    public function __construct($message=null,$code=0)
    {
        $this->ErrorInfo = '自訂錯誤類的錯誤資訊';
        parent::__construct($message,$code);
    }   
    //提供擷取自訂類資訊的方法
    public function GetErrorInfo()
    {
        return $this->ErrorInfo;
    }
    /**
     *
     *這裡還可以添加異常日誌,只需在上面的建構函式裡調用就可以了
     *
     */
    public function log($file)
    {
        file_put_contents($fiel,$this->__toString(),FILE_APPEND);
    }
}
function connectToDatabase()
{   
    throw new MyException("ErrorMessage");
}
try
{   
    connectToDatabase();
}
catch(MyException $e)
{   
    echo $e->getMessage() . "\n";
    echo $e->GetErrorInfo();
}

set_exception_handler 設定一個使用者定義的異常處理函數

當一個未捕獲的異常發生時所調用的函數名稱作為set_exception_handler的參數。該函數必須在調用set_exception_handler()之前被定義。該函數接受一個參數,該參數是一個拋出的異常對象。這可以用來改進上邊提到的異常記錄Tlog。

複製代碼 代碼如下:

function ExceptionLogger($exception)
{
    $file='ExceptionLog.log';
    file_put_contents($fiel,$exception->__toString(),FILE_APPEND);
}
set_exception_handler(ExceptionLogger);

1.3、PHP 允許在 catch 代碼塊內再次拋出(throw)異常。

複製代碼 代碼如下:

try
{
    #code...
}
catch(Exception $e)
{
    if($e->getCode() == 999)
    {
        #進行一些操作
    }
    else
    {
        throw $e;
    }
}

總結

異常的功能非常強大,但是不以為著我們可以在項目中肆意的濫用異常機制,特別是大量使用異常日誌的機制,這回大大增加系統系統開銷降低應用程式的效能。利用錯誤碼我們可以方便的對錯誤資訊進行管理,當一個錯誤資訊被多次平拋出時,使用錯誤碼是科學的選擇。我們甚至可以通過錯誤碼來讓錯誤訊息也支援多語言顯示。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.