首頁 > 後端開發 > php教程 > php異常處理與錯誤處理的方法總結

php異常處理與錯誤處理的方法總結

WBOY
發布: 2016-07-25 08:58:02
原創
1034 人瀏覽過
try{
  1. $a = fopen('test.txt','r');
  2. //這裡並沒有對檔案進行判斷就開啟了,如果檔案不存在就會報錯
  3. ?>
複製程式碼

正確的寫法:

  1. if(file_exists('test.txt')){
  2. $f=fopen('test.txt', 'r');
  3. //使用完後關閉
  4. fclose($f);
  5. }
  6. ?>
複製程式碼

複製程式碼
    一、PHP錯誤處理的三種方式 方式一、簡單的die()語句; 等價於exit(); 例子:
  1. if(!file_exists('aa.txt')){
  2. die('檔案不存在');
  3. } else {
  4. //執行操作
}
//如果上面die()觸發,那麼這裡echo接不被執行echo 'ok';

複製程式碼
    簡潔寫法:
file_exits('aaa.txt') or die('檔案不存在');echo 'ok';

複製程式碼

方式二,自訂錯誤與錯誤觸發器

1、錯誤處理器(自訂錯誤,一般用於文法錯誤處理) 建立自訂錯誤函數(處理器),函數必須有能力處理至少兩個參數(error_level和errormessage),但可以接受最多五個參數(error_file、error_line、 error_context) 文法: function error_function($error_level,$error_message,$error_file,$error_line,$error_context) //建立好後還需要改寫set_error_handler();函數 set_error_handler(‘error_function’,E_WARNING);//這裡error_function對應上面建立的自訂處理器名,第二個參數為使用自訂錯誤處理器的錯誤等級; 錯誤報告等級(了解即可)

這些錯誤報告等級是錯誤處理程序旨在處理的錯誤的不同的類型: 值 常數 描述 2 E_WARNING 非致命的 run-time 錯誤。不暫停腳本執行。 8 E_NOTICE Run-time 通知。

腳本發現可能有錯誤發生,但也可能在腳本正常運作時發生。 256 E_USER_ERROR 致命的使用者產生的錯誤。這類似於程式設計師使用 PHP 函數 trigger_error() 設定的 E_ERROR。 512 E_USER_WARNING 非致命的使用者產生的警告。這類似於程式設計師使用 PHP 函數 trigger_error() 設定的 E_WARNING。 1024 E_USER_NOTICE 用戶產生的通知。這類似於程式設計師使用 PHP 函數 trigger_error() 設定的 E_NOTICE。 4096 E_RECOVERABLE_ERROR 可捕獲的致命錯誤。類似 E_ERROR,但可被使用者定義的處理程序擷取。 (參見 set_error_handler()) 8191 E_ALL 所有錯誤和警告,除級別 E_STRICT 以外。 (在 PHP 6.0,E_STRICT 是 E_ALL 的一部份)
    2、錯誤觸發器(一般用於處理邏輯上的錯誤) 需求:例如要接收一個年齡,如果數字大於120,就認為是錯誤 傳統方法:
  1. if($age>120){
  2. echo '年齡錯誤';exit();
  3. }
  4. 使用觸發器:
  5. if($age>120){
  6. //trigger_error('錯誤訊息'[,'錯誤等級']);這裡錯誤等級為可選項,用於定義該錯誤的等級
  7. //使用者定義的等級包含以下三種:E_USER_WARNING 、E_USER_ERROR 、E_USER_NOTICE
  8. trigger_error('年齡錯誤');//這裡是呼叫的系統預設的錯誤處理方式,我們也可以用自訂處理器
  9. }
  10. //自訂處理器,與上方相同
  11. function myerror($error_level,$error_message){
echo 'error text';
} // //同時需要改變系統預設的處理函數
複製程式碼

set_error_handler('myerror',E_USER_WARNING);//同上面,第一個參數為自訂函數的名稱,第二個為錯誤等級【這裡的錯誤等級通常為以下三種 :E_USER_WARNING 、E_USER_ERROR 、E_USER_NOTICE】 //現在再使用trigger_error就可以使用自訂的錯誤處理函數了 練習題:

  1. date_default_timezone_set('PRC');
  2. function myerror($error_level,$error_levelage,$. "錯誤編號:$error_leveln";
  3. $info.= "錯誤訊息:$error_messagen";
  4. $info.= '發生時間:'.date('Y-m-d H:i:s');
  5. $filename='aa.txt';
  6. if(!$fp=fopen($filename,'a')){
  7. '建立檔案'.$filename.'失敗';
  8. }
  9. if(is_writeable($filename)){
  10. if(!fwrite($fp,$info)){
  11. echo '寫入檔案失敗';
  12. } else {
  13. echo '已成功記錄錯誤訊息';
  14. }
  15. fclose($fp);
  16. } else {
  17. echo '檔案'.$filename.'不可寫';
  18. }
  19. exit( );
  20. }
  21. set_error_handler('myerror',E_WARNING);
  22. $fp=fopen('aaa.txt','r');
  23. ?>
複製程式碼
方式三,錯誤日誌 預設的根據php.ini中error_log配置,php向伺服器的錯誤記錄系統或檔案傳送錯誤記錄。 透過使用error_log()函數可以向檔案或遠端目的地發送錯誤記錄; 文法: error_log(error[,type,destination,headers])

type部分一般用3,表示在文件後面追加錯誤訊息,而不會覆蓋原內容 destination表示目的地,即存放的文件或遠端目的地 如:error_log(“$error_info”,3,”errors.txt”);

二、PHP異常處理

1、基本文法

  1. try{
  2. //可能出現錯誤或異常的程式碼
  3. //catch 捕捉Exception是php已定義好的異常類別
  4. } catch(Exception $e){
  5. //對例外處理,方法:
  6. //1、自行處理
  7. //2、不處理,再拋出
  8. }
複製程式碼
2、處理處理程序應包含: Try – 使用異常的函數應該位於 “try” 程式碼區塊內。如果沒有觸發異常,則程式碼將照常繼續執行。但是如果異常被觸發,會拋出一個異常。 Throw – 這裡規定如何觸發異常。每一個 “throw” 必須對應至少一個 “catch” Catch – “catch” 程式碼區塊會捕捉到異常,並建立一個包含異常訊息的物件

觸發一個異常:

  1. //建立可拋出一個異常的函數
  2. function checkNum($number){
  3. if($ number>1){
  4. throw new Exception("Value must be 1 or below");
  5. }
  6. return true;
  7. }
  8. //在"try" 程式碼區塊中觸發異常
  9. try{
  10. checkNum(2);
  11. //如果異常被拋出,那麼下面一行程式碼將不會被輸出
  12. echo 'If you see this, the number is 1或 below';
  13. }catch(Exception $e){
  14. //捕獲異常
  15. echo 'Message: ' .$e->getMessage();
  16. }
  17. ?>
  18. ?>
  19. ?> >
複製程式碼

以上程式碼會報這樣一個錯誤: Message: Value must be 1 or below

解釋:

上面的程式碼拋出了一個異常,並捕獲了它:

建立 checkNum() 函數。它檢測數字是否大於 1。如果是,則拋出一個異常。 在 “try” 程式碼區塊中呼叫 checkNum() 函數。 checkNum() 函數中的例外被拋出 「catch」 程式碼區塊接收到該異常,並建立一個包含異常訊息的物件 ($e)。 透過從這個 exception 物件呼叫 $e->getMessage(),輸出來自該異常的錯誤訊息 不過,為了遵循「每個 throw 必須對應一個 catch」的原則,可以設定一個頂層的異常處理器來處理漏掉的錯誤。

set_exception_handler()函數可設定處理所有未捕獲異常的使用者定義函數

  1. //設定一個頂層異常處理器

  2. function myexception($e){
  3.   echo 'this is top exception';
  4. } //修改預設的例外處理器
  5. set_exception_handler("myexception");
  6. try{
  7. >try{
  8.   $i=5]
  9.  if($i  throw new exception('$i must greater than 10');
  10.  }
  11. }catch(Exception $e){

  12. //處理異常
  13. echo $e->getMessage().'
    ';
  14. //不處理異常,繼續拋出
  15. throw new exception('errorinfo'); //也可以用throw $e 保留原始錯誤訊息;
  16. }
複製程式碼

建立一個自訂的異常類

  1. class customException extends Exception{
  2.  public function errorMessage(){ 〟 on line '.$this->getLine().' in '.$this->getFile().': '.$this->getMessage().' is not a valid E- Mail
  3. address'; return $errorMsg;
  4. }
  5. }
  6. //使用
  7. try{
  8.   throw new customException('try{
  9.   throw new customException('try{
  10.  『throw new customException('try{
  11.  『throw new customException('erroreor message');   echo $e->errorMsg();
  12. }
複製程式碼

複製程式碼
  1. 複製程式碼
  2. 複製程式碼
  3. 複製程式碼
複製程式碼
用多個catch來傳回不同情況下的錯誤訊息

  $i=5;   if($i>0){ );//使用自訂異常類別處理
  } if($i     throw new exception('error2');//使用系統預設異常處理
『〜>} catch(customException $e){
  echo $e->getMessage();
}catch(Exception $e1){
  echo $e1->getMessage();  『echo $e1->getMessage(); }複製程式碼有關異常的使用規則: 1,將需要進行異常處理的程式碼放入 try 程式碼區塊內,以便捕捉潛在的異常。 2,每個try或throw程式碼區塊必須至少擁有一個對應的 catch 程式碼區塊。 3,使用多個 catch 程式碼區塊可以捕捉不同種類的異常。 4,可以在try程式碼內的catch 程式碼區塊中再次拋出(re-thrown)異常。 記住一句話:如果拋出了異常,就必須捕獲它。
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板