在php中我們用到最常用的錯誤機制有try catch{}這個來處理可以很即食麵的捕捉到錯誤,但在php中對於很多還提供了錯誤查看和錯誤關閉這個可以在php.ini中處理也可以在檔案最開始加個error_display(0);來不顯示錯誤
| 代碼如下 |
複製代碼 |
$a = fopen('test.txt','r'); //這裡並沒有對檔案進行判斷就開啟了,如果檔案不存在就會報錯 ?> |
那麼正確的寫法應該如下:
| 代碼如下 |
複製代碼 |
if(file_exists('test.txt')){ $f=fopen('test.txt','r'); //使用完後關閉 fclose($f); } ?> |
一、PHP錯誤處理的三種方式A、簡單的die()語句;
等價於exit();
例:
| 代碼如下 |
複製代碼 |
if(!file_exists('aa.txt')){ die('檔案不存在'); } else { //執行操作 } //如果上面die()被觸發,那麼這裡echo接不被執行 echo 'ok'; |
簡潔寫法:
| 代碼如下 |
複製代碼 |
file_exits('aaa.txt') or die('檔案不存在'); echo 'ok'; |
B、自訂錯誤和錯誤觸發器
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,就認為是一個錯誤
傳統方法:
if($age>120){
echo '年齡錯誤';exit();
}
使用觸發器:
if($age>120){
//trigger_error('錯誤資訊'[,'錯誤等級']);這裡錯誤等級為可選項,用於定義該錯誤的層級
//使用者定義的層級包含以下三種:E_USER_WARNING 、E_USER_ERROR 、E_USER_NOTICE
trigger_error('年齡錯誤');//這裡是調用的系統預設的錯誤處理方式,我們也可以用自訂處理器
}
//自訂處理器,與上面相同
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就可以使用自訂的錯誤處理函數了
練習題:
| 代碼如下 |
複製代碼 |
date_default_timezone_set('PRC'); function myerror($error_level,$error_message){ $info= "錯誤號碼:$error_leveln"; $info.= "錯誤資訊:$error_messagen"; $info.= '發生時間:'.date('Y-m-d H:i:s'); $filename='aa.txt'; if(!$fp=fopen($filename,'a')){ '建立檔案'.$filename.'失敗'; } if(is_writeable($filename)){ if(!fwrite($fp,$info)){ echo '寫入檔案失敗'; } else { echo '已成功記錄錯誤資訊'; } fclose($fp); } else { echo '檔案'.$filename.'不可寫'; } exit(); } set_error_handler('myerror',E_WARNING); $fp=fopen('aaa.txt','r'); ?> |
1 2
http://www.bkjia.com/PHPjc/632215.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632215.htmlTechArticle在php中我們用到最常用的錯誤機制有try catch{}這個來處理可以很即食麵的捕捉到錯誤,但在php中對於很多還提供了錯誤查看和錯誤關閉這個可...