首頁 > 後端開發 > php教程 > PHP的錯誤處理的問題

PHP的錯誤處理的問題

迷茫
發布: 2023-03-06 22:08:02
原創
1449 人瀏覽過

PHP的錯誤處理機制

php的錯誤處理是比較複雜的, 本文講解php中所有錯誤相關的重要知識點做一次梳理, 便於理解php的錯誤機制.

基礎知識

在此之前, 先熟悉一下php error的基礎知識

  • #預先定義常數

  • ##運行時配置

  • 異常

  • 錯誤處理函數

預先定義常數

定義了所有php的錯誤類型常數, 每一個常數都是一個整數數值, 它的作用在於

#上面的值(數值或符號)用於建立一個二進位位元掩碼,來制定要報告的錯誤訊息。可以使用位元運算子來組合這些值或屏蔽某些類型的錯誤。請注意,在 php.ini 之中,只有'|', '~', '!', '^' 和 '&' 會正確解析。

從使用的角度看, 可以分為三類:

  1. 使用者手動拋出的


    E_USER_NOTICE, E_USER_WARNING, E_USER_ERROR, E_USER_DEPRECATED

  2. #使用者造成的


    E_NOTICE#, E_PARSE, E_WARNING, E_ERROR, E_COMPILE_ERROR, E_COMPILE_WARNING, E_STRICT, E_RECOVERABLE_ERROR

  3. php核心造成的


    E_CORE_ERROR, E_CORE_WARNING

從是否終止程式執行的角度看, 可分為兩類

  1. 終止程式執行

    程式終止, 進入處理錯誤流程

  2. 不終止程式執行

    產生錯誤, 但程式仍可以繼續執行, 同樣進入錯誤處理流程

#對於PHP中的錯誤類型, 可以參考這篇更詳細的文章- -PHP的錯誤機制總結

運行時配置

手冊--運行時配置講解的很詳細, 但有幾個配置仍需特別注意

  1. #error_reporting報告錯誤的類型, 建議在開發/測試環境配置成
    E_ALL, 解決所有的類型的錯誤後, 在生產環境配置E_ALL & E_DEPRECATED, 則表示:報告除廢棄錯誤以外的所有錯誤

  2. display_errors是否顯示錯誤, 在生產環境中配置成false , 配合上面
    error_reporting的設定, 則表示: 報告除廢棄錯誤外的所有錯誤, 但不顯示錯誤訊息.

  3. ##log_errors

    錯誤記錄是否開啟, 生產環境需開啟
    . 配合上面的兩項配置, 則表明: 報告除廢棄錯誤外的所有錯誤, 不顯示錯誤訊息, 但記錄(只有php自己可以操作錯誤訊息)到日誌中.

  4. 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) {
     
     ... 
     
     if (null === $error) {
         // 通过这种方式可以获取最后一条错误
        $error = error_get_last();
     }

     ... 
     
     // log or other logic
}
登入後複製

異常

#根據w3cPHP 異常處理中的講解:

異常處理用於在指定的錯誤(異常)情況發生時改變腳本的正常流程。這種情況稱為異常。
當異常被觸發時,通常會發生:


    當前程式碼狀態被保存
  • 程式碼執行被切換到預先定義的異常處理器函數
  • 根據情況,處理器也許會從已儲存的程式碼狀態重新開始執行程式碼,終止腳本執行,或從程式碼中外的位置繼續執行腳本

未被catch的異常會終止腳本執行並產生一個E-ERROR錯誤, 執行定義的異常處理, 若無則進行php預設的錯誤處理流程, 即記錄到日誌中. 但在程式設計概念上應該將異常與錯誤分開, 異常對於用戶而言是可預見的, 不符合預期的, 可控制的結構.

上文提到的set_exception_handler就是處理異常的, 用法與set_error_handler一致. 在各框架中的異常處理很成熟, 大致都是在set_exception_handler中將Exception轉移到框架可處理級別, 框架同時會開放良好的介面供用戶使用, 從而達到用戶控制異常處理的目的, 實現定制和擴展.

總結

php的錯誤處理機制總是被忽略, 但它對調試,監控錯誤有很大的作用. 本文主要介紹了其中的主要知識點, 並做了一個梳理, 希望對大家有用.更多的細節還請查看手冊.

學習資料

#預先定義常數
執行階段配置
錯誤處理函數
PHP的錯誤機制總結
異常
Errors
PHP 異常處理
Symfony Debug:是一個完整的應用, 可以說是一個全面的指導教程, 所有與error相關的知識點都涉及到了. 建議閱讀源代碼.

以上是PHP的錯誤處理的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板