摘要:運行時警告非致命錯誤。初始化啟動過程中發生的警告非致命錯誤。表示腳本遇到可能會表現為錯誤的情況用戶產生的通知信息。該函數以數組的形式返回最后發生的錯誤。所以異常經常被當做程序的控制流程使用。在調用后異常會中止。
Error Error級別 Fatal Error:致命錯誤(腳本終止運行)
E_ERROR 致命的運行時的致命錯誤,終止程序執行 E_CORE_ERROR PHP 啟動時的致命錯誤 E_COMPILE_ERROR PHP編譯時的致命錯誤 E_USER_ERROR 用戶產生的致命錯誤Parse Error:編譯時的解析錯誤(腳本終止運行)
Parse Error 編譯時的語法解析錯誤Warning Error:警告錯誤(僅給出提示信息,但是腳本不會終止運行。)
E_WARNING 運行時警告 (非致命錯誤)。 E_CORE_WARNING PHP初始化啟動過程中發生的警告 (非致命錯誤) 。 E_COMPILE_WARNING 編譯警告 E_USER_WARNING 用戶產生的警告信息Notice Error:通知錯誤(僅給出通知信息,但是腳本不會終止運行。)
E_NOTICE 運行時通知。表示腳本遇到可能會表現為錯誤的情況. E_USER_NOTICE 用戶產生的通知信息。set_error_handler()捕獲錯誤【有局限】 函數說明
set_error_handler($callback);//設置一個用戶的函數(error_handler)來處理腳本中出現的錯誤。函數的局限性
以下級別的錯誤不能由用戶定義的函數來處理:
E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 調用 set_error_handler() 函數所在文件中產生的大多數 E_STRICT。
也就是:set_error_handler($callback)只能捕獲系統產生的一些Warning、Notice級別的Error。
使用方法輸出結果:
"errno":8 "errstr":Undefined variable: test "errfile":/Users/shuchao/Desktop/handler.php "errline":13如何捕獲PHP的Fatal Error、Parse Error等 需求描述獲取PHP的fatal error,比如記錄到Log里面,利于我們分析線上問題,可以做線上服務的監控。
兩個函數 register_shutdown_function()register_shutdown_function($callback)register_shutdown_function(),就把你要注冊進去的function放進【假裝是隊列吧】,等到腳本正常退出或顯示調用exit時,再把注冊進去的function拉出來執行.
register_shutdown_function()調用的3種情況:
腳本正常退出時;
在腳本運行(run-time not parse-time)出錯退出時;
用戶調用exit方法退出時。
error_get_last()error_get_last();//函數獲取最后發生的錯誤。該函數以數組的形式返回最后發生的錯誤。
返回的數組包含 4 個鍵和值:
[type] - 錯誤類型
使用方法
[message] - 錯誤消息
[file] - 發生錯誤所在的文件
[line] - 發生錯誤所在的行強烈注意在parse-time出錯的時候,是不會調用register_shutdown_function()函數的。只有在run-time出錯的時候,才會調用register_shutdown_function()。
下面我們舉例說明:
NO.1error_handler.php
執行結果如下:
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/error_handler.php:6) in /Users/shuchao/Desktop/error_handler.php on line 7原因分析
在執行error_handler.php的時候,由于重復定義了兩個函數test(),在php的parse-time就出錯了(不是run-time),所以不能回調register_shutdown_function()中的函數。
NO.2error_handler.php
執行結果如下:
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/error_handler.php:9) in /Users/shuchao/Desktop/error_handler.php on line 7 Yeah,it"s worked!%原因分析
我們看到,上面回調了register_shutdown_function().
NO.3
因為我們加了一個if()判斷,if()里面的test()方法,相當于一個閉包,與外面的test()名稱不沖突。
也就是,上面的代碼在parse-time沒有出錯,而是在run-time的時候出錯了,所以我們能夠獲取到fatal error。error_handler.php
test_error.php
執行 test_error.php的結果如下
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/test_error.php:3) in /Users/shuchao/Desktop/test_error.php on line 4原因分析
當我們在運行test_error.php的時候,因為redeclare了兩個test()方法,所以php的語法解析器在parse-time的時候就出錯了。 所以不能回調register_shutdown_function()中的方法,不能catch住這個fatal error。
NO.4error_handler.php
test_error.php
include_all.php
require "./error_handler.php"; require "./test_error.php";執行 include_all.php的結果如下
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/include_all.php:2) in /Users/shuchao/Desktop/include_all.php on line 3 Yeah,it"s worked!%結果分析
上面我們捕獲了fatal_error.
因為在運行include_all.php的時候,include_all.php本身語法并沒有出錯,也就是在parse-time的時候并沒有出錯,而是include的文件出錯了,也就是在run-time的時候出錯了,這個時候是能回調register_shutdown_function()中的函數的。強烈建議:如果我們要使用register_shutdown_function進行錯誤捕捉,使用NO.4,最后一種方法,可以確保錯誤都能捕捉到。
更優美的寫法·獲取所有錯誤 set_error_handler()與register_shutdown_function()、error_get_last()的結合使用Exception Exception與Error的區別 Exception當異常拋出的時候,我們是想要去捕獲他,并去做處理的。
Error
所以異常經常被當做程序的控制流程使用。Error是不可恢復的,是在開發過程中要去解決的。
使用Exception的例子我想執行insert語句插入一條數據,可能插入失敗(比如ID重復),注意是可能失敗,所以這是一個可能的情況,也就是異常情況。
我們就可以使用異常來處理這個問題try { $row->insert(); $inserted = true; } catch (Exception $e) { echo "There was an error inserting the row - ".$e->getMessage(); $inserted = false; } echo "Some more stuff";如何catch一個未捕獲的Exception 場景描述假設程序中的有些地方直接throw了異常,沒有進行catch。
一個函數:set_exception_handler()
我們現在想要不管在程序的任何一個地方throw異常,即便在throw的地方沒有被catch,我們也要能catch住,如何做到呢?//設置默認的異常處理程序,用于沒有用 try/catch 塊來捕獲的異常。 在 exception_handler 調用后異常會中止。 set_exception_handler()使用示例 1、exception_handler.phpgetMessage(); }2、test_exception.php現在我們運行 test_exception.php,結果如下:
I am Exception //證明我們throw的Exception被捕獲了更多精彩,請關注公眾號“聊聊代碼”,讓我們一起聊聊“左手代碼右手詩”的事兒。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21932.html
摘要:原文地址在初探先從一個簡單的服務器開始中依次講解了三個逐漸進步的服務器只能服務于一個客戶端的服務器利用可以服務于多個客戶端的額服務器利用預派生進程服務于多個客戶端的服務器最后一種服務器的進程模型基本上的大概原理其實跟我們常用的是非常 [原文地址:https://blog.ti-node.com/blog...] 在<PHP socket初探 --- 先從一個簡單的socket服務器開始...
目錄介紹 01.網絡請求異常分類 02.開發中注意問題 03.原始的處理方式 04.如何減少代碼耦合性 05.異常統一處理步驟 06.完成版代碼展示 好消息 博客筆記大匯總【16年3月到至今】,包括Java基礎及深入知識點,Android技術博客,Python學習筆記等等,還包括平時開發中遇到的bug匯總,當然也在工作之余收集了大量的面試題,長期更新維護并且修正,持續完善……開源的文件是m...
目錄介紹 01.網絡請求異常分類 02.開發中注意問題 03.原始的處理方式 04.如何減少代碼耦合性 05.異常統一處理步驟 06.完成版代碼展示 好消息 博客筆記大匯總【16年3月到至今】,包括Java基礎及深入知識點,Android技術博客,Python學習筆記等等,還包括平時開發中遇到的bug匯總,當然也在工作之余收集了大量的面試題,長期更新維護并且修正,持續完善……開源的文件是ma...
閱讀 2792·2021-09-01 10:30
閱讀 1686·2019-08-30 15:52
閱讀 973·2019-08-29 18:40
閱讀 1129·2019-08-28 18:30
閱讀 2399·2019-08-23 17:19
閱讀 1330·2019-08-23 16:25
閱讀 2703·2019-08-23 16:18
閱讀 2983·2019-08-23 13:53