PHP 錯誤捕捉處理 Exception
例外是用來改變的正常流通腳本,如果出現錯誤指定
什麼是異常
在PHP 5中來到一個新的面向對象的方式處理錯誤。
異常處理是用來改變正常流通的執行代碼,如果某一特定的錯誤(例外)條件發生。這個條件是所謂的一個例外。
這就是通常當一個例外是觸發:
目前的代碼保存狀況
該代碼執行將切換到預先確定的(自訂)例外處理函數
根據不同的情況下,處理程序就可以恢復執行的代碼保存狀態,終止腳本執行或繼續腳本從一個不同的位置中的代碼
我們將表現出不同的錯誤處理方法:
基本使用例外
創建自定義異常處理
多例外
再扔一個例外
設置頂層異常處理
注:例外只應該用於錯誤條件,不應該被用來跳轉到另一地點的代碼在指定點。
基本使用的例外
當一個異常,下面的代碼將無法執行, PHP將試圖找到匹配的“ catch ”塊。
如果一個例外是沒有抓住,一個致命的錯誤將印發了“ Uncaught異常”的消息。
可以嘗試拋出一個例外沒有趕上它:
<?php //create function with an exception function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } //trigger exception checkNum(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 exception function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } //trigger exception in a "try" block try { 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 exception catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?>以上代碼將得到一個錯誤這樣的:
Message: Value must be 1 or below為例解釋說:
上述的程式碼罰球一個例外,捕獲它:
該checkNum ( )函數創建。它會檢查,如果數大於1 。如果是這樣,一個異常
該checkNum ( )函數被稱為一個“嘗試”塊
唯一的例外內checkNum ( )函數拋出
在“ catch ”塊retrives例外,並創建一個對象(英文)載有異常信息
錯誤訊息的例外是呼應呼吁$電子商務“ getMessage ( )從物體的例外
然而,有一個方式,這裡的“每一個扔必須有一個追趕”的規則是設定一個最高水平異常處理程序來處理錯誤的漏網之魚。
-------------------------------------------------- ------------------------------
創建自定義異常處理類
創建自定義異常處理程序相當簡單。我們只是創建一個特殊階層的功能,可以說是一個例外時,發生在PHP 。類必須有一個延伸的例外類。
自定義異常處理類繼承的財產從PHP的異常處理類,你可以添加自定義它的職能。
讓我們創造一個例外類別:<?php class 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 = "[email protected]";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 ”塊漁獲量的例外,並顯示錯誤訊息
-------------------------------------------------- ------------------------------
多例外
這是可能的腳本來使用多個例外來檢查多個條件。
可以使用一些如..其他區塊,一個開關,或巢多個例外。這些例外可以使用不同的例外班級和返回不同的錯誤信息:
<?php class 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 = "[email protected]"; 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 ”塊。
應的腳本系統錯誤隱藏用戶。系統錯誤可能是重要的編碼器,但不感興趣的用戶。為了讓您方便的用戶可以重新擲的例外與用戶友好的訊息:
<?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = $this->getMessage().' is not a valid E-Mail address.'; return $errorMsg; } }$email = "[email protected]";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例外。
<?php function 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塊
一個簡單的規則:如果你扔東西,你必須趕上它。