PHP自訂錯誤處理

來源:互聯網
上載者:User

標籤: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學習教程 發表

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.