PHP的错误处理机制
php的錯誤處理是比較復(fù)雜的, 本文講解php中所有錯誤相關(guān)的重要知識點做一次梳理, 便于理解php的錯誤機制.
基礎(chǔ)知識
在此之前, 先熟悉一下php error的基礎(chǔ)知識
- 預(yù)定義常量
- 運行時配置
- 異常
- 錯誤處理函數(shù)
預(yù)定義常量
定義了所有php的錯誤類型常量, 每一個常量都是一個整型數(shù)值, 它的作用在于
上面的值(數(shù)值或者符號)用于建立一個二進(jìn)制位掩碼,來制定要報告的錯誤信息。可以使用按位運算符來組合這些值或者屏蔽某些類型的錯誤。請注意,在 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
E_CORE_ERROR,?E_CORE_WARNING
從是否終止程序執(zhí)行的角度看, 可分為兩類
終止程序執(zhí)行
程序終止, 進(jìn)入處理錯誤流程
不終止程序執(zhí)行
產(chǎn)生錯誤, 但程序仍可以繼續(xù)執(zhí)行, 同樣進(jìn)入錯誤處理流程
對于PHP中的錯誤類型, 可以參考這篇更詳細(xì)的文章--PHP的錯誤機制總結(jié)
運行時配置
手冊--運行時配置講解的很詳細(xì), 但有幾個配置仍需特別注意
error_reporting
報告錯誤的類型, 建議在開發(fā)/測試環(huán)境配置成E_ALL, 解決所有的類型的錯誤后, 在生產(chǎn)環(huán)境配置E_ALL & E_DEPRECATED, 則表明:報告除廢棄錯誤外的所有錯誤
display_errors
是否顯示錯誤, 在生產(chǎn)環(huán)境中配置成false, 配合上面error_reporting的設(shè)置, 則表明: 報告除廢棄錯誤外的所有錯誤, 但不顯示錯誤信息.
log_errors
錯誤記錄是否開啟,?生產(chǎn)環(huán)境需開啟. 配合上面的兩項配置, 則表明: 報告除廢棄錯誤外的所有錯誤, 不顯示錯誤信息, 但記錄(只有php自己可以操作錯誤信息)到日志中.
error_log
指定錯誤的文件(syslog是特殊值).默認(rèn)未被設(shè)置, 手冊中:
如果該配置沒有設(shè)置,則錯誤信息會被發(fā)送到 SAPI 錯誤記錄器
一般情況下, 未設(shè)置會被記錄到apache/nginx的錯誤日志中. 配合上面三項配置, 則表明: 報告除廢棄錯誤外的所有錯誤, 不顯示錯誤信息, 但記錄到apache/nginx日志中.若配置了文件路徑, 則表明:?報告除廢棄錯誤外的所有錯誤, 不顯示錯誤信息, 但記錄到file_dir日志中.
上面這幾項配置影響著php錯誤最基本的表現(xiàn).當(dāng)然,這些配置可以通過?ini_set()?在代碼中更改 或 php-fpm配置更改
錯誤處理函數(shù)
錯誤函數(shù)并不多, 最應(yīng)該關(guān)注的就是set_error_handler?和?set_exception_handler, 因為通過它們可以介入錯誤/異常的處理流程.
上面提到過, 錯誤發(fā)生后, 都會進(jìn)行錯誤處理流程, 那錯誤流程是如何定義的?
先看看php手冊中的講解:?Errors
簡單來說就是,?默認(rèn)的處理流程就是通過配置完成, 但我們可以設(shè)置自定義的錯誤處理流程
終止腳本執(zhí)行的錯誤如何處理
上文提到過, 錯誤有兩種, 那對于這種會終止腳本執(zhí)行的錯誤如何處理?
set_error_handler不能處理這種錯誤, 這一點很容易被忽略. 所以要尋找另一種方法.
這個問題基本上是這樣完成的(還未見過其他方案):
// 終止腳本的錯誤會終止腳本執(zhí)行 // 即會調(diào)用已通過register_shutdown_function注冊的處理函數(shù) // 由此可注冊我們的錯誤處理流程, 這樣就進(jìn)入了自定義錯誤流程 register_shutdown_function('FatalErrorHandle');...FatalErrorHandle(array $error = null) { ... if (null === $error) { // 通過這種方式可以獲取最后一條錯誤 $error = error_get_last(); } ... // log or other logic }異常
根據(jù)w3cPHP 異常處理中的講解:
異常處理用于在指定的錯誤(異常)情況發(fā)生時改變腳本的正常流程。這種情況稱為異常。
當(dāng)異常被觸發(fā)時,通常會發(fā)生:
- 當(dāng)前代碼狀態(tài)被保存
- 代碼執(zhí)行被切換到預(yù)定義的異常處理器函數(shù)
- 根據(jù)情況,處理器也許會從保存的代碼狀態(tài)重新開始執(zhí)行代碼,終止腳本執(zhí)行,或從代碼中外的位置繼續(xù)執(zhí)行腳本
未被catch的異常會終止腳本執(zhí)行并產(chǎn)生一個E-ERROR錯誤, 執(zhí)行定義的異常處理, 若無則進(jìn)行php默認(rèn)的錯誤處理流程, 即記錄到日志中. 但在編程概念上應(yīng)該將異常與錯誤分開, 異常對于用戶而言是可預(yù)見的, 不符合預(yù)期的, 可控制的結(jié)構(gòu).
上文提到的set_exception_handler就是處理異常的, 用法與set_error_handler一致. 在各框架中的異常處理很成熟, 大致都是在set_exception_handler中將Exception轉(zhuǎn)移到框架可處理級別, 框架同時會開放良好的接口供用戶使用, 從而達(dá)到用戶控制異常處理的目的, 實現(xiàn)定制和擴展.
總結(jié)
php的錯誤處理機制總是被忽略, 但它對調(diào)試, 監(jiān)控錯誤有很大的作用. 本文主要介紹了其中的主要知識點, 并做了一個梳理, 希望對大家有用.更多的細(xì)節(jié)還請查看手冊.
學(xué)習(xí)資料
預(yù)定義常量
運行時配置
錯誤處理函數(shù)
PHP的錯誤機制總結(jié)
異常
Errors
PHP 異常處理
Symfony Debug:是一個完整的應(yīng)用, 可以說是一個全面的指導(dǎo)教程, 所有與error相關(guān)的知識點都涉及到了. 建議閱讀源代碼.
轉(zhuǎn)載于:https://www.cnblogs.com/zcbing/p/6637926.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的PHP的错误处理机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ object model
- 下一篇: 动态规划算法php,php算法学习之动态