PHP 錯誤捕捉處理 Exception

來源:互聯網
上載者:User

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 6
Try, 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塊
一個簡單的規則:如果你扔東西,你必須趕上它。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.