|
使用異常
php5 增加了類似其他語言的異常處理模塊。在php代碼中所產(chǎn)生的異常可被 throw 語句拋出并被 catch 語句捕獲。需要進行異常處理的代碼都必須放入到 try 代碼塊內(nèi),以便捕獲可能存在的異常。每個try至少對應(yīng)一個 catch 塊。使用多個 catch 可以捕獲不同的類所產(chǎn)生的異常。當(dāng) try 代碼塊不再拋出異常或者找不到 catch 能匹配所拋出的異常時,php 代碼就會在跳轉(zhuǎn)到最后一個 catch 的后面繼續(xù)執(zhí)行。當(dāng)然,php 允許在 catch 代碼塊內(nèi)再次拋出(throw)異常。
預(yù)定義異常 Exception
Exception 類是所有異常的基類,我們可以通過派生 Exception 類來達到自定義異常的目的。下面的清單列出了 Exception 的基本信息。
復(fù)制代碼 代碼如下:
Exception {
/* 屬性 */
protected string $message ; //異常消息內(nèi)容
protected int $code ; //異常代碼
protected string $file ; //拋出異常的文件名
protected int $line ; //拋出異常在該文件中的行號
/* 方法 */
public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]] ) //異常構(gòu)造函數(shù)
final public string getMessage ( void ) //獲取異常消息內(nèi)容
final public Exception getPrevious ( void ) //返回異常鏈中的前一個異常
final public int getCode ( void ) //獲取異常代碼
final public string getFile ( void ) //獲取發(fā)生異常的程序文件名稱
final public int getLine ( void ) //獲取發(fā)生異常的代碼在文件中的行號
final public array getTrace ( void ) //獲取異常追蹤信息
final public string getTraceAsString ( void ) //獲取字符串類型的異常追蹤信息
public string __toString ( void ) //將異常對象轉(zhuǎn)換為字符串
final private void __clone ( void ) //異常克隆
}
了解完 Exception 后,我們來嘗試擴展 exception 類來實現(xiàn)一個自定義異常。
復(fù)制代碼 代碼如下:
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.”。或許你想還想顯示數(shù)據(jù)庫連接失敗的原因信息。下面及通過擴展exception類來實現(xiàn)我們的自定義信息。
復(fù)制代碼 代碼如下:
class MyException extends Exception
{
protected $ErrorInfo;
//構(gòu)造函里處理一些邏輯,然后將一些信息傳遞給基類
public function __construct($message=null,$code=0)
{
$this->ErrorInfo = '自定義錯誤類的錯誤信息';
parent::__construct($message,$code);
}
//提供獲取自定義類信息的方法
public function GetErrorInfo()
{
return $this->ErrorInfo;
}
/**
*
*這里還可以添加異常日志,只需在上面的構(gòu)造函數(shù)里調(diào)用就可以了
*
*/
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 設(shè)置一個用戶定義的異常處理函數(shù)
當(dāng)一個未捕獲的異常發(fā)生時所調(diào)用的函數(shù)名稱作為set_exception_handler的參數(shù)。該函數(shù)必須在調(diào)用set_exception_handler()之前被定義。該函數(shù)接受一個參數(shù),該參數(shù)是一個拋出的異常對象。這可以用來改進上邊提到的異常記錄日志處理。
復(fù)制代碼 代碼如下:
function ExceptionLogger($exception)
{
$file='ExceptionLog.log';
file_put_contents($fiel,$exception->__toString(),FILE_APPEND);
}
set_exception_handler(ExceptionLogger);
1.3、php 允許在 catch 代碼塊內(nèi)再次拋出(throw)異常。
復(fù)制代碼 代碼如下:
try
{
#code...
}
catch(Exception $e)
{
if($e->getCode() == 999)
{
#進行一些操作
}
else
{
throw $e;
}
}
總結(jié)
異常的功能非常強大,但是不以為著我們可以在項目中肆意的濫用異常機制,特別是大量使用異常日志的機制,這回大大增加系統(tǒng)系統(tǒng)開銷降低應(yīng)用程序的性能。利用錯誤代碼我們可以方便的對錯誤信息進行管理,當(dāng)一個錯誤信息被多次平拋出時,使用錯誤代碼是科學(xué)的選擇。我們甚至可以通過錯誤代碼來讓錯誤消息也支持多語言顯示。
php技術(shù):PHP 面向?qū)ο蟪绦蛟O(shè)計(oop)學(xué)習(xí)筆記 (四) - 異常處理類Exception,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。