PHP的錯誤處理機制

2022-04-25 16:06:03 字數 3099 閱讀 9226

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_handlerset_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 ...