PHP 錯誤捕捉處理 Exception
例外是用來改變的正常流通指令碼,如果出現錯誤指定
什麼是異常
在PHP 5中來到一個新的物件導向的方式處理錯誤。
異常處理是用來改變正常流通的執行代碼,如果某一特定的錯誤(例外)條件發生。這個條件是所謂的一個例外。
這就是通常當一個例外是觸發:
目前的代碼儲存狀況
該代碼執行將切換到預先確定的(自訂)例外處理函數
根據不同的情況下,處理常式就可以恢複執行的代碼儲存狀態,終止指令碼執行或繼續指令碼從一個不同的位置中的代碼
我們將表現出不同的錯誤處理方法:
基本使用例外
建立自訂異常處理
多例外
再扔一個例外
設定頂層異常處理
註:例外只應該用於錯誤條件,不應該被用來跳轉到另一地點的代碼在指定點。
基本使用的例外
當一個異常,下面的代碼將無法執行, PHP將試圖找到匹配的“ catch ”塊。
如果一個例外是沒有抓住,一個致命的錯誤將印發了“ Uncaught異常”的訊息。
可以嘗試拋出一個例外沒有趕上它:
<?php//create function with an exceptionfunction checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; }//trigger exceptioncheckNum(2);?>
以上代碼將得到一個錯誤這樣的:
Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in C:webfoldertest.php:6 Stack trace: #0 C:webfoldertest.php(12): checkNum(28) #1 {main} thrown in C:webfoldertest.php on line 6Try, throw and catch
為了避免錯誤從上面的例子中,我們必須創造適當的代碼來處理一個例外。
適當的異常代碼應包括以下內容:
嘗試-函數使用一個例外應在“嘗試”區塊。如果例外不會觸發,代碼將繼續正常。但是,如果觸發的例外,一個例外是“扔”
扔掉-這是你如何觸發一個例外。每一個“扔”必須至少有一個“迎頭趕上”
抓住-這是一種“ c atch”塊擷取一個例外,並建立一個對象含有異常資訊
可以嘗試觸發一個例外有效代碼:
<?php//create function with an exceptionfunction checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; }//trigger exception in a "try" blocktry { checkNum(2); //If the exception is thrown, this text will not be shown echo 'If you see this, the number is 1 or below'; }//catch exceptioncatch(Exception $e) { echo 'Message: ' .$e->getMessage(); }?>
以上代碼將得到一個錯誤這樣的:
Message: Value must be 1 or below
為例解釋說:
上述的程式碼罰球一個例外,捕獲它:
該checkNum ( )函數建立。它會檢查,如果數大於1 。如果是這樣,一個異常
該checkNum ( )函數被稱為一個“嘗試”塊
唯一的例外內checkNum ( )函數拋出
在“ catch ”塊retrives例外,並建立一個對象(英文)載有異常資訊
錯誤訊息的例外是呼應呼籲$電子商務“ getMessage ( )從物體的例外
然而,有一個方式,這裡的“每一個扔必須有一個追趕”的規則是設定一個最高水平例外處理常式來處理錯誤的漏網之魚。
-------------------------------------------------- ------------------------------
建立自訂異常處理類
建立自訂例外處理常式相當簡單。我們只是建立一個特殊階層的功能,可以說是一個例外時,發生在PHP 。
類必須有一個延伸的例外類。
自訂異常處理類繼承的財產從PHP的異常處理類,你可以添加自訂它的職能。
讓我們創造一個例外類別:
<?phpclass customException extends Exception { public function errorMessage() { //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address'; return $errorMsg; } }$email = "someone@example...com";
try { //check if if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //throw exception if email is not valid throw new customException($email); } }catch (customException $e) { //display custom message echo $e->errorMessage(); }?>
新的類別是一份舊的例外類的增加errorMessage ( )函數。由於這是一份舊的階級,它繼承了屬性和方法從舊的階級,我們可以使用一流的方法除了像返回傳生異常( )和getFile ( )和getMessage ( ) 。
為例解釋說:
上述的程式碼罰球一個例外,它捕獲了自訂異常類:
該customException ( )建立一流的延伸舊的例外類。這樣,它繼承了所有方法和屬性從舊的例外類
該errorMessage ( )函數建立。此函數返回一個錯誤資訊,如果e - mail地址是無效的
美元的電子郵件變數設定為一個字串,不是一個有效e - mail地址
的“嘗試”阻止執行和異常以來, e - mail地址是無效的
在“ catch ”塊漁獲量的例外,並顯示錯誤訊息
-------------------------------------------------- ------------------------------
多例外
這是可能的指令碼來使用多個例外來檢查多個條件。
可以使用一些如..其他區塊,一個開關,或巢多個例外。這些例外可以使用不同的例外班級和返回不同的錯誤資訊:
<?phpclass customException extends Exception{public function errorMessage(){//error message$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile().': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';return $errorMsg;}}$email = "someone@example.com";try { //check if if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //throw exception if email is not valid throw new customException($email); } //check for "example" in mail address if(strpos($email, "example") !== FALSE) { throw new Exception("$email is an example e-mail"); } }catch (customException $e) { echo $e->errorMessage(); }catch(Exception $e) { echo $e->getMessage(); }?>
為例解釋說:
以上代碼測試兩個條件和罰球一個例外,如果任何條件沒有得到滿足:
該customException ( )建立一流的延伸舊的例外類。這樣,它繼承了所有方法和屬性從舊的例外類
該errorMessage ( )函數建立。此函數返回一個錯誤資訊,如果e - mail地址是無效的
美元的電子郵件變數設定為一個字串,是一個有效e - mail地址,但包含字串“榜樣”
的“嘗試”阻止執行和一個例外是不扔的首要條件
第二個條件觸發一個例外,因為電子郵件包含字串“榜樣”
在“ catch ”塊漁獲量的例外,並顯示正確的錯誤訊息
如果沒有customException追趕,只有例外的基礎副漁獲物,除將處理有
-------------------------------------------------- ------------------------------
再扔例外
有時,當一個異常,你不妨來處理它不同於標準的方式。這是有可能拋出一個例外,第二次在“ catch ”塊。
應的指令碼系統錯誤隱藏使用者。系統錯誤可能是重要的編碼器,但不感興趣的使用者。為了讓您方便的使用者可以重新擲的例外與方便使用的訊息:
<?phpclass customException extends Exception { public function errorMessage() { //error message $errorMsg = $this->getMessage().' is not a valid E-Mail address.'; return $errorMsg; } }$email = "someone@example.com";
try { try { //check for "example" in mail address if(strpos($email, "example") !== FALSE) { //throw exception if email is not valid throw new Exception($email); } } catch(Exception $e) { //re-throw exception throw new customException($email); } }catch (customException $e) { //display custom message echo $e->errorMessage(); }?>
為例解釋說:
以上代碼的測試,如果電子郵件地址包含字串“榜樣”中,如果這樣做,除了重新拋出:
該customException ( )建立一流的延伸舊的例外類。這樣,它繼承了所有方法和屬性從舊的例外類
該errorMessage ( )函數建立。此函數返回一個錯誤資訊,如果e - mail地址是無效的
美元的電子郵件變數設定為一個字串,是一個有效e - mail地址,但包含字串“榜樣”
的“嘗試”塊包含了一個“嘗試”塊,使其能夠重新拋除
唯一的例外是引發自電子郵件包含字串“榜樣”
在“ catch ”塊漁獲量的例外和再拋出一個“ customException ”
該“ customException ”是捕獲和顯示錯誤訊息
如果例外的是沒有抓住目前的“嘗試”區塊,它將尋求一個catch塊的“更高水平” 。
-------------------------------------------------- ------------------------------
設定頂層異常處理
該set_exception_handler ( )函數設定一個使用者定義的函數來處理所有uncaught例外。
<?phpfunction myException($exception){echo "<b>Exception:</b> " , $exception->getMessage();}set_exception_handler('myException');throw new Exception('Uncaught Exception occurred');?>
輸出如下.
Exception: Uncaught Exception occurred
在以上代碼不存在“ catch ”塊。相反,高層引發例外處理。此功能應該用來捕獲uncaught例外。
規則的例外
代碼可能是包圍在try塊,以協助追趕潛力例外
每一個try塊或“扔”必須至少有一個與之對應的catch
多個catch可以用來捕獲不同的類的例外
例外可以扔(或重新拋出)在catch塊在一個try塊
一個簡單的規則:如果你扔東西,你必須趕上它。