php的錯誤處理是比較複雜的, 本文講解php中所有錯誤相關的重要知識點做一次梳理, 便於理解php的錯誤機制.
在此之前, 先熟悉一下php error的基礎知識
定義了所有php的錯誤型別常量, 每乙個常量都是乙個整型數值, 它的作用在於
上面的值(數值或者符號)用於建立乙個二進位制位掩碼,來制定要報告的錯誤資訊。可以使用按位運算子來組合這些值或者遮蔽某些型別的錯誤。請注意,在 php.ini 之中,只有'|', '~', '!', '^' 和 '&' 會正確解析。從使用的角度看, 可以分為三類:
使用者手動丟擲的
e_user_notice
,e_user_warning
,e_user_error
,e_user_deprecated
使用者造成的
e_notice
,e_parse
,e_warning
,e_error
,e_compile_error
,e_compile_warning
,e_strict
,e_recoverable_error
php核心造成的
e_core_error
,e_core_warning
從是否終止程式執行的角度看, 可分為兩類
終止程式執行
程式終止, 進入處理錯誤流程
不終止程式執行
產生錯誤, 但程式仍可以繼續執行, 同樣進入錯誤處理流程
手冊--執行時配置講解的很詳細, 但有幾個配置仍需特別注意
error_reporting
報告錯誤的型別, 建議在開發/測試環境配置成e_all
, 解決所有的型別的錯誤後, 在生產環境配置e_all & e_deprecated
, 則表明:報告除廢棄錯誤外的所有錯誤
display_errors
是否顯示錯誤, 在生產環境中配置成false, 配合上面error_reporting
的設定, 則表明: 報告除廢棄錯誤外的所有錯誤, 但不顯示錯誤資訊.
log_errors
錯誤記錄是否開啟,生產環境需開啟. 配合上面的兩項配置, 則表明: 報告除廢棄錯誤外的所有錯誤, 不顯示錯誤資訊, 但記錄(只有php自己可以操作錯誤資訊)到日誌中.
error_log
指定錯誤的檔案(syslog是特殊值).預設未被設定, 手冊中:
如果該配置沒有設定,則錯誤資訊會被傳送到 sapi 錯誤記錄器一般情況下, 未設定會被記錄到apache/nginx的錯誤日誌中. 配合上面三項配置, 則表明: 報告除廢棄錯誤外的所有錯誤, 不顯示錯誤資訊, 但記錄到apache/nginx日誌中.若配置了檔案路徑, 則表明:報告除廢棄錯誤外的所有錯誤, 不顯示錯誤資訊, 但記錄到
file_dir
日誌中.
上面這幾項配置影響著php錯誤最基本的表現.當然,這些配置可以通過ini_set()
在**中更改 或 php-fpm配置更改
錯誤函式並不多, 最應該關注的就是set_error_handler
和set_exception_handler
, 因為通過它們可以介入錯誤/異常的處理流程.
上面提到過, 錯誤發生後, 都會進行錯誤處理流程, 那錯誤流程是如何定義的?上文提到過, 錯誤有兩種, 那對於這種會終止指令碼執行的錯誤如何處理?先看看php手冊中的講解: errors
簡單來說就是,預設的處理流程就是通過配置完成, 但我們可以設定自定義的錯誤處理流程
set_error_handler
不能處理這種錯誤, 這一點很容易被忽略. 所以要尋找另一種方法.
這個問題基本上是這樣完成的(還未見過其他方案):
// 終止指令碼的錯誤會終止指令碼執行
// 即會呼叫已通過register_shutdown_function註冊的處理函式
// 由此可註冊我們的錯誤處理流程, 這樣就進入了自定義錯誤流程
register_shutdown_function('fatalerrorhandle');
...fatalerrorhandle(array $error = null)
...
// log or other logic
}
根據w3cphp 異常處理中的講解:
異常處理用於在指定的錯誤(異常)情況發生時改變指令碼的正常流程。這種情況稱為異常。未被catch的異常會終止指令碼執行並產生乙個e-error錯誤, 執行定義的異常處理, 若無則進行php預設的錯誤處理流程, 即記錄到日誌中. 但在程式設計概念上應該將異常與錯誤分開, 異常對於使用者而言是可預見的, 不符合預期的, 可控制的結構.當異常被觸發時,通常會發生:
上文提到的set_exception_handler
就是處理異常的, 用法與set_error_handler
一致. 在各框架中的異常處理很成熟, 大致都是在set_exception_handler
中將exception
轉移到框架可處理級別, 框架同時會開放良好的介面供使用者使用, 從而達到使用者控制異常處理的目的, 實現定製和擴充套件.
預定義常量
執行時配置
錯誤處理函式
php的錯誤機制總結
異常errors
php 異常處理
symfony debug:是乙個完整的應用, 可以說是乙個全面的指導教程, 所有與error相關的知識點都涉及到了. 建議閱讀源**.
PHP 錯誤處理機制
在日常的專案開發過程中,總是會出現一些我們意想不到的異常錯誤,如果我們對此沒有進行相對完善的處理,那麼程式看上去也很不專業,也很可能就會成為別人攻擊系統的有效資訊 有些錯誤異常會終止指令碼執行,這個時候如果沒有一些錯誤提示資訊的話,那麼我們只能從頭開始看 了,要知道專案中成百上千行的 對我們來說是件...
PHP 錯誤處理機制
在日常的專案開發過程中,總是會出現一些我們意想不到的異常錯誤,如果我們對此沒有進行相對完善的處理,那麼程式看上去也很不專業,也很可能就會成為別人攻擊系統的有效資訊 有些錯誤異常會終止指令碼執行,這個時候如果沒有一些錯誤提示資訊的話,那麼我們只能從頭開始看 了,要知道專案中成百上千行的 對我們來說是件...
php中錯誤處理機制
php中,異常處理機制是有限的,無法自動丟擲異常,必須手動進行,並且內建異常有限。php把許多異常看作錯誤,這樣就可以把這些異常想錯誤一樣用set error handler接管,進而主動丟擲異常。比如以下warning型別的錯誤是捕獲不到的 warning division by zero in ...