在PHP中,錯誤有輕重之分。嚴重的錯誤會中斷腳本的繼續執行,這是致命的錯誤,有點像Java中的Error和Exception,但Java中的Error源於JVM錯誤,無法被coder處理;而輕微的錯誤不中斷腳本的繼續執行,但產生一些錯誤信息(可以設置不顯示這些警告信息),這是非致命的錯誤,有點像Java中的RuntimeException,不強求coder對之處理。
在PHP中,錯誤與異常是兩種不同的東西。錯誤由系統拋出,也可以由coder手動拋出,並且都可以被coder捕獲並處理。與Java等強類型語言不同,PHP不會自動拋出異常,而必須全部由coder手動拋出。異常一旦被拋出就必須有相應的代碼對它處理,否則將會造成腳本執行的中斷。
ini_set('display_errors', 'On'); ini_set('error_reporting', E_ALL | E_STRICT); try { $foo++; } catch (Exception $e) { echo 'I catch you!';//try catch能捕獲異常,而不能捕獲錯誤 } echo 'go on ...';輸出:
Notice: Undefined variable: foo in ****** on line 3
go on …
可見對未初始化的$foo進行加法運算會產生E_NOTICE錯誤,從而輸出了一行警告信息。但不影響腳本後續部分的執行。
如果開啟了日志功能(log_errors=On),則在php日志文件中可以同樣看到:
[03-Sep-2009 14:02:31] PHP Notice: Undefined variable: foo in ****** on line 3
可見對未初始化的$foo進行加法運算會產生E_NOTICE錯誤,從而輸出了一行警告信息。但不影響腳本後續部分的執行。
如果開啟了日志功能(log_errors=On),則在php日志文件中可以同樣看到:
[03-Sep-2009 14:02:31] PHP Notice: Undefined variable: foo in ****** on line 3
PHP中有哪些錯誤?
PHP使用常量標記了以下幾種常見的錯誤類型:
E_NOTICE:run-time通知。腳本發現可能有錯誤發生,但也可能在腳本正常運行時發生。如使用了未定義或未初始化的變量等。
E_WARNING:run-time警告。不暫停腳本執行。如mysql_connect()連接失敗。
E_ERROR:run-time錯誤,腳本執行被中斷。如使用了未定義的class。
E_USER_NOTICE:由coder使用trigger_error(‘error’, E_USER_NOTICE)手動拋出的run-time通知,腳本執行不被中斷。
E_USER_WARNING:由coder使用trigger_error(‘error’, E_USER_WARNING)手動拋出的run-time警告,腳本執行不被中斷。
E_USER_ERROR:由coder使用trigger_error(‘error’, E_USER_ERROR)手動拋出的run-time錯誤,腳本執行被中斷。
E_PARSE:致命的parse錯誤。
E_COMPILE_ERROR:致命的compile錯誤。
E_COMPILE_WARNING:非致命的compile警告,腳本執行不被中斷。
E_CORE_ERROR:致命的內核錯誤。
E_CORE_WARNING:非致命的內核警告,腳本執行不被中斷。
如何配置錯誤報告?
PHP根據錯誤的類型,用常量標記了不同的錯誤報告級別,顧名思義地處理相應類型的錯誤。在配置中合理配置錯誤報告級別,可以控制哪些類型的錯誤顯示、哪些不顯示。
E_ERROR
E_WARNING
E_PARSE
E_NOTICE
E_CORE_ERROR
E_CORE_WARNING
E_COMPILE_ERROR
E_COMPILE_WARNING
E_USER_ERROR
E_USER_WARNING
E_USER_NOTICE
E_ALL:顯示所有的警告、通知和錯誤,但不包括E_STRICT定義的部分。在PHP6.0中,E_STRICT是E_ALL的一部分。
E_STRICT:顯示向後兼容性的建議。
E_RECOVERABLE_ERROR:顯示可捕獲的致命錯誤。類似 E_ERROR,但可被用戶定義的處理程序捕獲。
E_NOTICE級別會產生巨大且重復的日志,建議在生產環境中不報告E_NOTICE,而在開發環境中報告E_NOTICE。
最佳實踐:在開發環境中為保持健壯性而配置php.ini為display_errors = On、error_reporting = E_ALL | E_STRICT、log_errors = On,而在生產環境中為保持安全性而配置php.ini為display_errors = Off、error_reporting = E_ALL & ~E_NOTICE、log_errors = On。
如果你使用的是共享主機而無法修改php.ini,可以使用ini_set()函數進行配置