當前位置:
首頁 > 知識 > 你知道PHP中Exception,Error Handler的這些細節嗎?

你知道PHP中Exception,Error Handler的這些細節嗎?

前言

最近項目中有一個功能需要實現:

調試模式下, 將所有錯誤提前輸出, 再輸出頁面內容.

為實現上述功能, 需使用到, 相關方法, 發現有許多坑, 故寫此文與大家分享.

主要函數

此篇文章重點關注以下幾個函數

這有什麼難的?

哈~ 如果您現在有標題中的感慨, 那麼也請關注以下本文中將重點講述的問題列表:

與 有什麼聯繫?

與 綁定的什麼時候才會啟動? 它們有什麼聯繫?

通常跟有關係么?

上述問題描述模糊, 因此答案也可能千人千面.

因此, 本文只給出自己的答案與大家分享, 如有問題或不同的見解, 期待與您溝通.

如果以上問題, 並不能引起您的興趣, 或者您已理解透徹了, 就可以自行右上角小紅叉啦~

解疑:1. 與 有什麼聯繫?

link: php.net - error_reporting()

link: php.net - error_get_last()

大家應該再熟悉不過了, 因此不再贅述.

獲取最後發生的錯誤.

通常用來獲取PHP運行過程中的錯誤().

這兩個函數在字面上關聯性並不強, 但請觀察以下代碼及輸出

雖然說明了獲取最後發生的錯誤, 實際上也是如此. 但卻沒有說明, 被忽略掉的錯誤是否有可能被獲取到, 因此, 當我們使用時需要注意我平時忽略掉的錯誤, 如:

2. 與 綁定的什麼時候才會啟動? 它們有什麼聯繫?

link: php.net - set_error_handler()

link: php.net - set_exception_handler()

設置用戶自定義的錯誤處理函數.

通常在PHP腳本運行過程中, 出現一些非中斷性錯誤時觸發.

我們會用這個來記錄錯誤日誌或直接輸出等操作.

注意:

: 標準的錯誤處理依然會被執行(標準錯誤處理根據 display_errors = true/false 決定是否輸出到)

參數大多設定為, 但建議設定為, 具體哪些錯誤需要被處理, 哪些不需要, 在內進行判斷明顯更加靈活.

以下級別的錯誤不能由用戶定義的函數來處理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 調用 set_error_handler() 函數所在文件中產生的大多數 E_STRICT

被觸發後, 並不會中斷PHP運行.

注意的返回值:

設置用戶自定義的異常處理函數

設置默認的異常處理程序,用於沒有用 try/catch 塊來捕獲的異常。 在 exception_handler 調用後異常會中止。

注意:

注意點中2, 3項輕描淡寫了一下之間的不同卻透露出重要的消息(坑..)

中, 不再只接受了, 並且接收了錯誤.

link: php.net - PHP7 Errors列表

調用後異常會中止(腳本終止).

, 的並不相同.

:

:

自 PHP 7 以來,大多數錯誤拋出 Error 異常,也能被捕獲。 Error 和 Exception 都實現了 Throwable 介面。

因此, 與 之間的關係也迎刃而解:

:

: 負責非中斷行錯誤.

: 負責沒有被catch的異常(會中斷).

等: 並不會被兩者管理, 正常輸出到屏幕上(弊端).

:

: 負責非中斷行錯誤.

: 負責沒有被catch的異常, (會中斷)

等: 由管理.

3. 通常跟Exception/Error有關係么?

link: php.net - register_shutdown_function()

註冊一個 callback ,它會在腳本執行完成或者 exit() 後被調用。

根據說明可以得出結論, 它與完全沒關係.

提出這個問題, 主要是因為, 在中並沒有明確的接收地點, 所以我們通常配合來接收

然而隨著的到來, 已經可以被捕捉了, 再通過就多餘了. 中更多的是一些版本冗餘的工作.

栗子

前言中的需求: 調試模式下, 將所有錯誤提前輸出, 再輸出頁面內容.

以下是demo, 省去了環境判斷(debug環境), 大家可以根據下面這段代碼, 了解本文中所說的各種的觸發和調用情況.

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 PHP技術大全 的精彩文章:

如何防護新型蠕蟲比特幣勒索病毒Petya
開源日誌管理系統
你不是不努力,而是不懂選擇
API 文檔神器 Swagger 介紹及在 PHP 項目中使用
Laravel artisan optimize 源碼解讀

TAG:PHP技術大全 |

您可能感興趣

Oracle開源GraphPipe:幾行代碼讓你在TensorFlow部署PyTorch模型
利用PHPstorm進行代碼review
php.ini中的include_path配置
php7在FreeBSD靜態編譯iconv,導致BUS ERROR (core dump)解決
Linux部署Nginx+Mysql+PHP+PHPMyAdmin4環境
php中的幾種輸出方式——printf、sprintf
StackOverflow 調查:富裕國家流行 Python和C 語言,低收入國家愛用 PHP
Linux查看Nginx、Apache、MySQL、PHP的編譯參數
濫用ThinkPHP漏洞的殭屍網路Hakai和Yowai
PPython:PHP 擁抱 Python 的利器
Zttp-一個基於 Guzzle Http 的更好用的 PHP HTTP Package
thinkphp5連接oracle資料庫
使用PHP簡單操作Memcached
WordPress Nginx 安全配置 – 禁用某些目錄執行PHP
StackOverflow 調查:高收入國家流行 Python和C 語言,低收入國家愛用 PHP
高性能的 PHP 封裝的 HTTP Restful 多線程並發請求庫-MultiHttp
php中curl同時發送多個請求curl_multi函數集的用法
PHP Session 封裝類
windows下php7.0安裝redis擴展包
PHP 使用 phpmailer 發送電子郵件