PHP高級程序設計 學習筆記 2014.06.12
異常經常被用來處理一些在程序正常執行中遇到的各種類型的錯誤。比如做數據庫鏈接時,你就要處理數據庫連接失敗的情況。使用異常可以提高我們程序的容錯特性,從而使我們的應用程序更加的穩定和健壯。
使用異常
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()之前被定義。該函數接受一個參數,該參數是一個拋出的異常對象。這可以用來改進上邊提到的異常記錄日志處理。
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; } }
總結
異常的功能非常強大,但是不以為著我們可以在項目中肆意的濫用異常機制,特別是大量使用異常日志的機制,這回大大增加系統系統開銷降低應用程序的性能。利用錯誤代碼我們可以方便的對錯誤信息進行管理,當一個錯誤信息被多次平拋出時,使用錯誤代碼是科學的選擇。我們甚至可以通過錯誤代碼來讓錯誤消息也支持多語言顯示。