通常情況下,php會將致命錯誤直接輸出,會將錯誤的出處(檔案位址,行號)和原因等輸出,這樣,開發著可以很方便的定位到問題。但有些時候,可能由於 php.ini 的設定問題,或第三方框架配置的問題,導致這些資訊沒有輸出,那麼此時,必須學會自己設定相關參數,輸出這些錯誤訊息,幫助快速定位問題。
error_reporting 是一個php的全域設定參數,在php.ini。用於配置錯誤輸出級別,可以用來設定錯誤輸出的級別。
error_reporting(int $level),$level為0的時候是關閉錯誤輸出,也就是任何錯誤都不會輸出。
set_error_handler
php的預設錯誤處理是將訊息輸出。但是,有時候需要定義一些其他操作,這時就需要自訂錯誤處理函數。
php提供內建函數 set_error_handler 可以幫助我們註冊自己的錯誤處理函數。函數原型如下:
mixed set_error_handler ( callback $error_handler [, int $error_types = E_ALL | E_STRICT ] )
#值得注意的是,即使註冊了錯誤處理函數,預設的行為仍然會執行,也就是錯誤出現時,仍然會輸出錯誤訊息,所以需要在程式中顯示的將錯誤等級設為0,然後再註冊自己的錯誤處理函數。這種方式,在生產環境下,尤其重要,因為即使出錯,敏感內部錯誤訊息也不會暴露給潛在的惡意使用者。還有很重要的一點要指出,自訂錯誤處理函數不能處理 fatal error(例如編譯錯誤)。
下面是一個使用自訂錯誤處理函數的列子:
<?php error_reporting(0); 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("%s: %s in %s on line %d\n", $error_type, $error_message, $file, $line); if ($exit) { die(); } } set_error_handler('error_handler');
echo $novar;
echo 3 / 0;
trigger_error('Trigger a fatal error', E_USER_ERROR );
new NonExist();
執行此腳本可以得到下面的輸出:
Notice: Undefined variable: novar in /your/php_demo_file.php on line 40
Warning: Division by zero in /your/php_demo_file.php on line 41
Fatal Error: Trigger a fatal error in /your/php_demo_file.php on line 42
##都可以看到,最後的“new NoExistClass()”的異常,沒有被自訂的錯誤處理函數捕獲。
最後,捎帶提一下,set_exception_handler 註冊頂層的例外處理,在web一用中,可以設定一下,然後統一的跳到錯誤處理頁面。 ######以上就是PHP自訂錯誤處理的案例,希望能幫助大家。 ######相關推薦:#########php自訂函數實作陣列比較功能的案例############php自訂/系統/類別常數程式碼實例詳解############php自訂/系統/類別常數程式碼實例詳解######以上是PHP自訂錯誤處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!