異常經常被用來處理一些在程式正常執行中遇到的各種類型的錯誤。例如做資料庫連結時,你就要處理資料庫連線失敗的情況。使用異常可以提高我們程式的容錯特性,從而使我們的應用程式更加的穩定和健壯。
使用異常
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; } }
總結
異常的功能非常強大,但是不以為我們可以在專案中肆意的濫用異常機制,特別是大量使用異常日誌的機制,這回大大增加系統系統開銷降低應用程式的效能。利用錯誤代碼我們可以方便的對錯誤訊息進行管理,當一個錯誤訊息被多次平拋出時,使用錯誤代碼是科學的選擇。我們甚至可以透過錯誤代碼來讓錯誤訊息也支援多語言顯示。
以上是php異常處理類別Exception用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!