日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

PHP的错误处理机制

發(fā)布時間:2024/7/19 php 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP的错误处理机制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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
  • php內(nèi)核造成的
    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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。