標籤:異常處理 apple extend dump ext elf 方法 sel tle
PHP 的異常處理
1、 什麼是異常?
異常是指一個程式在運行過程出現的一個意外或者事件,中斷了正常指令的執行,跳轉到其他模組繼續執行。
PHP 5 提供了一種新的物件導向的錯誤處理方法。
異常處理用於在指定的錯誤(異常)情況發生時改變指令碼的正常流程。這種情況稱為異常。
當異常被觸發時,通常會發生:
當前代碼狀態被儲存
代碼執行被切換到預定義的異常處理器函數
根據情況,處理器也許會從儲存的代碼狀態重新開始執行代碼,
終止指令碼執行,或從代碼中另外的位置繼續執行指令碼
我們將展示不同的錯誤處理方法:
異常的基本使用
建立自訂的異常處理器
多個異常
重新拋出異常
設定頂層異常處理器
2. 異常處理類
PHP具有很多異常處理類,其中Exception是所有異常處理的基類。
Exception::__clone — 異常複製{}
final private void Exception::__clone ( void ) 嘗試複製異常,這將導致一個致命錯誤。
Exception具有幾個基本屬性與方法,其中包括了:
message 異常訊息內容
code 異常代碼
file 拋出異常的檔案名稱
line 拋出異常在該檔案的行數
其中常用的方法有:
getTrace 擷取異常追蹤資訊
getTraceAsString 擷取異常追蹤資訊的字串
getMessage 擷取出錯資訊
在PHP代碼中所產生的異常可被 throw 語句拋出並被 catch 語句捕獲。需要進行異常處理的代碼都必須放入到 try 代碼塊內,以便捕獲可能存在的異常。每個try至少對應一個 catch 塊。使用多個 catch 可以捕獲不同的類所產生的異常。當 try 代碼塊不再拋出異常或者找不到 catch 能匹配所拋出的異常時,PHP 代碼就會在跳轉到最後一個 catch 的後面繼續執行。當然,PHP 允許在 catch 代碼塊內再次拋出(throw)異常。
例如:
擴充(extend) PHP 內建的異常處理類
<?php/** * 自訂一個異常處理類 */class MyException extends Exception{ // 重定義構造器使 message 變為必須被指定的屬性 public function __construct($message, $code = 0, Exception $previous = null) { // 自訂的代碼 // 確保所有變數都被正確賦值 parent::__construct($message, $code, $previous); } // 自訂字串輸出的樣式 public function __toString() { return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; } public function customFunction() { echo "A custom function for this type of exception\n"; }}/** * 建立一個用於測試異常處理機制的類 */class TestException{ public $var; const THROW_NONE = 0; const THROW_CUSTOM = 1; const THROW_DEFAULT = 2; function __construct($avalue = self::THROW_NONE) { switch ($avalue) { case self::THROW_CUSTOM: // 拋出自訂異常 throw new MyException(‘1 is an invalid parameter‘, 5); break; case self::THROW_DEFAULT: // 拋出預設的異常 throw new Exception(‘2 is not allowed as a parameter‘, 6); break; default: // 沒有異常的情況下,建立一個對象 $this->var = $avalue; break; } }}// 例子 1try { $o = new TestException(TestException::THROW_CUSTOM);} catch (MyException $e) { // 捕獲異常 echo "Caught my exception\n", $e; $e->customFunction();} catch (Exception $e) { // 被忽略 echo "Caught Default Exception\n", $e;}// Continue executionvar_dump($o); // Nullecho "\n\n";// 例子 2try { $o = new TestException(TestException::THROW_DEFAULT);} catch (MyException $e) { // 不能匹配異常的種類,被忽略 echo "Caught my exception\n", $e; $e->customFunction();} catch (Exception $e) { // 捕獲異常 echo "Caught Default Exception\n", $e;}// 執行後續代碼var_dump($o); // Nullecho "\n\n";// 例子 3try { $o = new TestException(TestException::THROW_CUSTOM);} catch (Exception $e) { // 捕獲異常 echo "Default Exception caught\n", $e;}// 執行後續代碼var_dump($o); // Nullecho "\n\n";// 例子 4try { $o = new TestException();} catch (Exception $e) { // 沒有異常,被忽略 echo "Default Exception caught\n", $e;}// 執行後續代碼var_dump($o); // TestExceptionecho "\n\n";?>
PHP的異常處理