標籤:http color 使用 io 檔案 資料 ar 2014
自訂錯誤報表的處理方式,可以完全繞過標準的PHP錯誤處理函數,這樣就可以按照自己定義的格式列印錯誤報表,或改變錯誤報表列印的位置(標準PHP的錯誤報表是哪裡發生錯誤就在發生位置處顯示)。以下幾種情況可以考慮自訂錯誤處理。
★可以記下錯誤的資訊,及時發現一些生產環境出現的問題。
★可以用來屏蔽錯誤。出現錯誤會把一些資訊暴漏給使用者,極有可能成為駭客攻擊你網站的工具。
★可以做相應的處理,將所有錯誤報表放到指令碼最後輸出,或出錯時可以顯示跳轉到預先定義好的出錯頁面,提供更好的使用者體驗,如果必要,還可以在自訂錯誤處理程式中,根據情況去終止指令碼運行。
★可以作為調試工具,一些時候必須在運行環境時調試一些東西,但又不想影響正在使用的使用者。
通常使用set_error_handler()函數去設定使用者自訂的錯誤處理函數,該函數用於建立運行時期間的使用者自己的錯誤處理方法,返回舊的錯誤處理程式,若失敗,則返回null。該函數有兩個參數,其中第一個參數是必選的,需要一個回呼函數,規定發生錯誤時啟動並執行函數。這個回呼函數一定要聲明4個參數,否則無效,按順序分別為“是否存在錯誤”、“錯誤資訊”、“錯誤檔案”和“錯誤行號”。set_error_handler()函數的第二個參數則為可選的,規定現在哪個錯誤報表層級會顯示使用者自訂的錯誤。預設是“E_ALL”。自訂錯誤處理的樣本如下所示:
| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
<?php error_reporting(0); //屏蔽程式中的錯誤//定義Error_Handler函數,作為set_error_handler()函數的第一個參數“回調”function error_handler($error_level,$error_message,$file,$line){$EXIT =FALSE;switch($error_level){//提醒層級case E_NOTICE:case E_USER_NOTICE:$error_type = ‘Notice‘;break;//警告層級case E_WARNING:case E_USER_WARNING:$error_type=‘warning‘;break;//錯誤層級case E_ERROR:case E_USER_ERROR:$error_type=‘Fatal Error‘;$EXIT = TRUE;break;//其他未知錯誤default:$error_type=‘Unknown‘;$EXIT = TRUE;break; }//直接列印錯誤資訊,也可以寫檔案,寫資料庫,反正錯誤資訊都在這,任你發落printf("<font color=‘#FF0000‘><b>%s</b></font>:%s in<b>%s</b> on line <b>%d</b><br>\n",$error_type, $error_message, $file, $line); //如果錯誤影響到程式的正常執行,跳轉到友好的錯誤提示頁面if (TURE==$EXIT){ echo ‘<script>location = "err.html";</scrpit>‘;}} //這個才是關鍵點,把錯誤的處理交給error_handle()set_error_handler(‘error_handler‘); //使用未定義的變數要報notice的echo $novar; //除以0要警示告的echo 3/0; //自訂一個錯誤trigger_error(‘Trigger a fatal error‘,E_USER_ERROR);?> |
本例所有列印的錯誤報表都是按自己定義的格式輸出的,不過有一點,系統直接報Fatal Error的這裡捕獲不到,因為系統不可能把這麼重大的錯誤教給你處理。遇到這種錯誤是必須要解決的,所以系統會直接終止程式運行。使用set_error_handler()函數可以很好地解決安全和調試方便的矛盾,而且你還可以花點心思,使錯誤提示更加美觀以配合網站的風格。不過要注意兩點。
①E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING是不會被這個控制代碼處理的,也就是會用最原始的方式顯示出來。不過出現這些錯誤都是編譯或PHP核心出錯,在通常情況下不會發生。
②使用set_error_handler()後,error_reporting()將會失效。也就是所有的錯誤(除上述的錯誤)都會教給自己定義的函數處理。
>> 本文固定連結: http://php.ncong.com/php_course/wrong/zidingyiwrong.html
>> 轉載請註明: 恩聰php 2014年08月05日 於 恩聰PHP學習教程 發表