摘要:運(yùn)行時(shí)警告非致命錯誤。初始化啟動過程中發(fā)生的警告非致命錯誤。表示腳本遇到可能會表現(xiàn)為錯誤的情況用戶產(chǎn)生的通知信息。該函數(shù)以數(shù)組的形式返回最后發(fā)生的錯誤。所以異常經(jīng)常被當(dāng)做程序的控制流程使用。在調(diào)用后異常會中止。
Error Error級別 Fatal Error:致命錯誤(腳本終止運(yùn)行)
E_ERROR 致命的運(yùn)行時(shí)的致命錯誤,終止程序執(zhí)行 E_CORE_ERROR PHP 啟動時(shí)的致命錯誤 E_COMPILE_ERROR PHP編譯時(shí)的致命錯誤 E_USER_ERROR 用戶產(chǎn)生的致命錯誤Parse Error:編譯時(shí)的解析錯誤(腳本終止運(yùn)行)
Parse Error 編譯時(shí)的語法解析錯誤Warning Error:警告錯誤(僅給出提示信息,但是腳本不會終止運(yùn)行。)
E_WARNING 運(yùn)行時(shí)警告 (非致命錯誤)。 E_CORE_WARNING PHP初始化啟動過程中發(fā)生的警告 (非致命錯誤) 。 E_COMPILE_WARNING 編譯警告 E_USER_WARNING 用戶產(chǎn)生的警告信息Notice Error:通知錯誤(僅給出通知信息,但是腳本不會終止運(yùn)行。)
E_NOTICE 運(yùn)行時(shí)通知。表示腳本遇到可能會表現(xiàn)為錯誤的情況. E_USER_NOTICE 用戶產(chǎn)生的通知信息。set_error_handler()捕獲錯誤【有局限】 函數(shù)說明
set_error_handler($callback);//設(shè)置一個(gè)用戶的函數(shù)(error_handler)來處理腳本中出現(xiàn)的錯誤。函數(shù)的局限性
以下級別的錯誤不能由用戶定義的函數(shù)來處理:
E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 調(diào)用 set_error_handler() 函數(shù)所在文件中產(chǎn)生的大多數(shù) E_STRICT。
也就是:set_error_handler($callback)只能捕獲系統(tǒng)產(chǎn)生的一些Warning、Notice級別的Error。
使用方法輸出結(jié)果:
"errno":8 "errstr":Undefined variable: test "errfile":/Users/shuchao/Desktop/handler.php "errline":13如何捕獲PHP的Fatal Error、Parse Error等 需求描述獲取PHP的fatal error,比如記錄到Log里面,利于我們分析線上問題,可以做線上服務(wù)的監(jiān)控。
兩個(gè)函數(shù) register_shutdown_function()register_shutdown_function($callback)register_shutdown_function(),就把你要注冊進(jìn)去的function放進(jìn)【假裝是隊(duì)列吧】,等到腳本正常退出或顯示調(diào)用exit時(shí),再把注冊進(jìn)去的function拉出來執(zhí)行.
register_shutdown_function()調(diào)用的3種情況:
腳本正常退出時(shí);
在腳本運(yùn)行(run-time not parse-time)出錯退出時(shí);
用戶調(diào)用exit方法退出時(shí)。
error_get_last()error_get_last();//函數(shù)獲取最后發(fā)生的錯誤。該函數(shù)以數(shù)組的形式返回最后發(fā)生的錯誤。
返回的數(shù)組包含 4 個(gè)鍵和值:
[type] - 錯誤類型
使用方法
[message] - 錯誤消息
[file] - 發(fā)生錯誤所在的文件
[line] - 發(fā)生錯誤所在的行強(qiáng)烈注意在parse-time出錯的時(shí)候,是不會調(diào)用register_shutdown_function()函數(shù)的。只有在run-time出錯的時(shí)候,才會調(diào)用register_shutdown_function()。
下面我們舉例說明:
NO.1error_handler.php
執(zhí)行結(jié)果如下:
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原因分析
在執(zhí)行error_handler.php的時(shí)候,由于重復(fù)定義了兩個(gè)函數(shù)test(),在php的parse-time就出錯了(不是run-time),所以不能回調(diào)register_shutdown_function()中的函數(shù)。
NO.2error_handler.php
執(zhí)行結(jié)果如下:
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!%原因分析
我們看到,上面回調(diào)了register_shutdown_function().
NO.3
因?yàn)槲覀兗恿艘粋€(gè)if()判斷,if()里面的test()方法,相當(dāng)于一個(gè)閉包,與外面的test()名稱不沖突。
也就是,上面的代碼在parse-time沒有出錯,而是在run-time的時(shí)候出錯了,所以我們能夠獲取到fatal error。error_handler.php
test_error.php
執(zhí)行 test_error.php的結(jié)果如下
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原因分析
當(dāng)我們在運(yùn)行test_error.php的時(shí)候,因?yàn)閞edeclare了兩個(gè)test()方法,所以php的語法解析器在parse-time的時(shí)候就出錯了。 所以不能回調(diào)register_shutdown_function()中的方法,不能catch住這個(gè)fatal error。
NO.4error_handler.php
test_error.php
include_all.php
require "./error_handler.php"; require "./test_error.php";執(zhí)行 include_all.php的結(jié)果如下
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!%結(jié)果分析
上面我們捕獲了fatal_error.
因?yàn)樵谶\(yùn)行include_all.php的時(shí)候,include_all.php本身語法并沒有出錯,也就是在parse-time的時(shí)候并沒有出錯,而是include的文件出錯了,也就是在run-time的時(shí)候出錯了,這個(gè)時(shí)候是能回調(diào)register_shutdown_function()中的函數(shù)的。強(qiáng)烈建議:如果我們要使用register_shutdown_function進(jìn)行錯誤捕捉,使用NO.4,最后一種方法,可以確保錯誤都能捕捉到。
更優(yōu)美的寫法·獲取所有錯誤 set_error_handler()與register_shutdown_function()、error_get_last()的結(jié)合使用Exception Exception與Error的區(qū)別 Exception當(dāng)異常拋出的時(shí)候,我們是想要去捕獲他,并去做處理的。
Error
所以異常經(jīng)常被當(dāng)做程序的控制流程使用。Error是不可恢復(fù)的,是在開發(fā)過程中要去解決的。
使用Exception的例子我想執(zhí)行insert語句插入一條數(shù)據(jù),可能插入失敗(比如ID重復(fù)),注意是可能失敗,所以這是一個(gè)可能的情況,也就是異常情況。
我們就可以使用異常來處理這個(gè)問題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一個(gè)未捕獲的Exception 場景描述假設(shè)程序中的有些地方直接throw了異常,沒有進(jìn)行catch。
一個(gè)函數(shù):set_exception_handler()
我們現(xiàn)在想要不管在程序的任何一個(gè)地方throw異常,即便在throw的地方?jīng)]有被catch,我們也要能catch住,如何做到呢?//設(shè)置默認(rèn)的異常處理程序,用于沒有用 try/catch 塊來捕獲的異常。 在 exception_handler 調(diào)用后異常會中止。 set_exception_handler()使用示例 1、exception_handler.phpgetMessage(); }2、test_exception.php現(xiàn)在我們運(yùn)行 test_exception.php,結(jié)果如下:
I am Exception //證明我們throw的Exception被捕獲了更多精彩,請關(guān)注公眾號“聊聊代碼”,讓我們一起聊聊“左手代碼右手詩”的事兒。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21932.html
摘要:原文地址在初探先從一個(gè)簡單的服務(wù)器開始中依次講解了三個(gè)逐漸進(jìn)步的服務(wù)器只能服務(wù)于一個(gè)客戶端的服務(wù)器利用可以服務(wù)于多個(gè)客戶端的額服務(wù)器利用預(yù)派生進(jìn)程服務(wù)于多個(gè)客戶端的服務(wù)器最后一種服務(wù)器的進(jìn)程模型基本上的大概原理其實(shí)跟我們常用的是非常 [原文地址:https://blog.ti-node.com/blog...] 在<PHP socket初探 --- 先從一個(gè)簡單的socket服務(wù)器開始...
摘要:當(dāng)運(yùn)行時(shí)系統(tǒng)遍歷調(diào)用棧而未找到合適的異常處理器,則運(yùn)行時(shí)系統(tǒng)終止。不可查異常編譯器不要求強(qiáng)制處置的異常包括運(yùn)行時(shí)異常與其子類和錯誤。 目錄介紹 1.什么是異常 2.異常 2.1 異常的概述和分類【了解】 2.2 JVM默認(rèn)是如何處理異常的【理解】 2.3 異常處理的兩種方式【理解】 2.4 try...catch的方式處理異常【掌握】 2.5 編譯期異常和運(yùn)行期異常的區(qū)別【理解】...
目錄介紹 01.網(wǎng)絡(luò)請求異常分類 02.開發(fā)中注意問題 03.原始的處理方式 04.如何減少代碼耦合性 05.異常統(tǒng)一處理步驟 06.完成版代碼展示 好消息 博客筆記大匯總【16年3月到至今】,包括Java基礎(chǔ)及深入知識點(diǎn),Android技術(shù)博客,Python學(xué)習(xí)筆記等等,還包括平時(shí)開發(fā)中遇到的bug匯總,當(dāng)然也在工作之余收集了大量的面試題,長期更新維護(hù)并且修正,持續(xù)完善……開源的文件是m...
目錄介紹 01.網(wǎng)絡(luò)請求異常分類 02.開發(fā)中注意問題 03.原始的處理方式 04.如何減少代碼耦合性 05.異常統(tǒng)一處理步驟 06.完成版代碼展示 好消息 博客筆記大匯總【16年3月到至今】,包括Java基礎(chǔ)及深入知識點(diǎn),Android技術(shù)博客,Python學(xué)習(xí)筆記等等,還包括平時(shí)開發(fā)中遇到的bug匯總,當(dāng)然也在工作之余收集了大量的面試題,長期更新維護(hù)并且修正,持續(xù)完善……開源的文件是ma...
閱讀 2801·2021-09-01 10:30
閱讀 1690·2019-08-30 15:52
閱讀 979·2019-08-29 18:40
閱讀 1134·2019-08-28 18:30
閱讀 2405·2019-08-23 17:19
閱讀 1333·2019-08-23 16:25
閱讀 2711·2019-08-23 16:18
閱讀 2988·2019-08-23 13:53