亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

PHP超實(shí)用系列·自動(dòng)捕獲Fatal Error

alphahans / 1791人閱讀

摘要:重要使命經(jīng)過(guò)十幾天的忙碌,張小五手上的項(xiàng)目終于如期上線,雖然很累,但內(nèi)心無(wú)比的充實(shí)與喜悅。對(duì),是不好捕獲。從到對(duì)于碼農(nóng)來(lái)說(shuō),從到是解決問(wèn)題的通途,當(dāng)然張小五也不例外。

重要使命

經(jīng)過(guò)十幾天的忙碌,張小五手上的項(xiàng)目終于如期上線,雖然很累,但內(nèi)心無(wú)比的充實(shí)與喜悅。喝了杯熱咖啡,小五在椅子上慵懶地躺著,享受著這份靜謐的時(shí)光。

"嗨,小五,這幾天累壞了吧?"
"哈哈,是有點(diǎn)累,不過(guò)還好。"

"周末好好休息下吧,我先跟你討論個(gè)事兒啊。"
"好的,Z哥。"

"咱們線上運(yùn)行的代碼,出于各種各樣的情況,可能會(huì)有好多Fatal Error、Exception。有沒(méi)有辦法,在出現(xiàn)Fatal Error、Exception的時(shí)候,咱們能自動(dòng)捕獲,并寫(xiě)到Log文件里?"
"嗯...這個(gè)嘛,出現(xiàn)Fatal Error的時(shí)候,腳本就終止了,不好捕獲啊。"

"對(duì),是不好捕獲。但是對(duì)于出現(xiàn)的Fatal Error、Exception我們不知道的話,不能提前發(fā)現(xiàn)問(wèn)題,就像身邊有個(gè)隱形的刺客一樣,讓人內(nèi)心特別虛啊..."
"這樣啊,Z哥,那我這幾天試一下吧!"

"好的,小五,這個(gè)挺重要的,相信你!"
"哈哈,Z哥你還是不要抱太大希望,我努力試一下就是了。"

從Google到SO

對(duì)于碼農(nóng)來(lái)說(shuō),從Google到Stackoverflow是解決問(wèn)題的通途,當(dāng)然張小五也不例外。

哈!不搜不知道,一搜嚇一跳,PHP還真有捕獲Error和Exception的函數(shù)。

//設(shè)置一個(gè)用戶的函數(shù)來(lái)處理腳本中出現(xiàn)的錯(cuò)誤。
set_error_handler($callback)
//設(shè)置一個(gè)用戶的函數(shù)來(lái)處理腳本中出現(xiàn)的異常。
set_exception_handler($callback)

張小五不自覺(jué)的笑了笑:“哈哈,不愧是世界上最好的語(yǔ)言!”

說(shuō)干就干,看看這兩個(gè)函數(shù)的威力怎樣,不一會(huì),小五就寫(xiě)出了測(cè)試代碼。

getMessage();
}
//拋出異常
throw new Exception("I am Exception");

Yes,拋出的一個(gè)Exception真的被捕獲了!

"接下來(lái)再測(cè)下set_error_handler(),你可不能讓我失望??!"小五心想。


不錯(cuò),Notice級(jí)別的錯(cuò)誤也捕獲到了!
接下來(lái)再測(cè)一下Fatal Error,如果Fatal Error也能捕獲到,這個(gè)需求就實(shí)現(xiàn)了!

抑制住激動(dòng)的心情,小五很快寫(xiě)完了測(cè)試代碼。


小五屏住呼吸,等待著奇跡的出現(xiàn)。"咣當(dāng)",手起指落,幾行報(bào)錯(cuò)躍然屏上...

神馬?Fatal Error竟然沒(méi)捕獲到?怎么可能?

正在小五陷入沉思的時(shí)候,不經(jīng)意間,小五瞥見(jiàn)了函數(shù)的說(shuō)明:

以下級(jí)別的錯(cuò)誤不能由用戶定義的函數(shù)來(lái)處理: 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級(jí)別的Error。

嗚呼悲催,好不容易找到了解決辦法,沒(méi)想到這函數(shù)竟然還是個(gè)半吊子,很多級(jí)別的錯(cuò)誤捕獲不到...?

眾里尋他千百度

王小五從不是輕言放棄的人,他又繼續(xù)搜索,尋找著解決辦法...

"嗯?哈哈,SO上還真有人遇到這問(wèn)題!"

小五專注地看著答案,邊看邊敲了起來(lái):

要實(shí)現(xiàn)這個(gè)需求,需要用到兩個(gè)函數(shù):register_shutdown_function()error_get_last()。

register_shutdown_function()
register_shutdown_function($callback)

register_shutdown_function(),就把你要注冊(cè)進(jìn)去的function放進(jìn)【假裝是隊(duì)列吧】,等到腳本正常退出或顯式調(diào)用exit()時(shí),再把注冊(cè)進(jìn)去的function拉出來(lái)執(zhí)行.

register_shutdown_function()調(diào)用的3種情況:

腳本正常退出時(shí);

在腳本運(yùn)行(run-time not parse-time)出錯(cuò)退出時(shí);

用戶調(diào)用exit方法退出時(shí)。

error_get_last()
error_get_last();//函數(shù)獲取最后發(fā)生的錯(cuò)誤。

該函數(shù)以數(shù)組的形式返回最后發(fā)生的錯(cuò)誤。

返回的數(shù)組包含 4 個(gè)鍵和值:
[type] - 錯(cuò)誤類型
[message] - 錯(cuò)誤消息
[file] - 發(fā)生錯(cuò)誤所在的文件
[line] - 發(fā)生錯(cuò)誤所在的行

強(qiáng)烈注意

在parse-time出錯(cuò)的時(shí)候,是不會(huì)調(diào)用register_shutdown_function()函數(shù)的。只有在run-time出錯(cuò)的時(shí)候,才會(huì)調(diào)用register_shutdown_function()。

為了更好的理解,下面我們舉例說(shuō)明:

NO.1
error_handler.php

執(zhí)行結(jié)果如下:

原因分析

在執(zhí)行error_handler.php的時(shí)候,由于重復(fù)定義了兩個(gè)函數(shù)test(),在php的parse-time就出錯(cuò)了(不是run-time),所以不能回調(diào)register_shutdown_function()中注冊(cè)的函數(shù)。

NO.2
error_handler.php

執(zhí)行結(jié)果如下:

原因分析

我們看到,上面回調(diào)了register_shutdown_function()中注冊(cè)的函數(shù)。
因?yàn)槲覀兗恿艘粋€(gè)if()判斷,if()里面的test()方法,相當(dāng)于一個(gè)閉包,與外面的test()名稱不沖突。
也就是,上面的代碼在parse-time沒(méi)有出錯(cuò),而是在run-time的時(shí)候出錯(cuò)了,所以我們能夠獲取到fatal error。

NO.3
error_handler.php

test.php

執(zhí)行 test.php的結(jié)果如下

原因分析

當(dāng)我們?cè)谶\(yùn)行test.php的時(shí)候,因?yàn)閞edeclare了兩個(gè)test()方法,所以php的語(yǔ)法解析器在parse-time的時(shí)候就出錯(cuò)了。 所以不能回調(diào)register_shutdown_function()中的方法,不能catch住這個(gè)fatal error。

NO.4
error_handler.php

test.php

include_all.php

執(zhí)行 include_all.php的結(jié)果如下

結(jié)果分析

上面我們捕獲了fatal_error。
因?yàn)樵谶\(yùn)行include_all.php的時(shí)候,include_all.php本身語(yǔ)法并沒(méi)有出錯(cuò),也就是在parse-time的時(shí)候并沒(méi)有出錯(cuò),而是include的文件出錯(cuò)了,也就是在run-time的時(shí)候出錯(cuò)了,這個(gè)時(shí)候是能回調(diào)register_shutdown_function()中的函數(shù)的。

強(qiáng)烈建議:如果我們要使用register_shutdown_function進(jìn)行錯(cuò)誤捕捉,使用NO.4,最后一種方法,可以確保錯(cuò)誤都能捕捉到。
驀然回首解需求

"哇塞,原來(lái)可以這樣啊!"
王小五按答案中舉的例子認(rèn)真的敲完代碼,瞬間明白了解決的辦法。

真可謂"眾里尋他千百度,驀然回首,那人卻在燈火闌珊處。"小二不自覺(jué)的感嘆道!

"好了,我自己就寫(xiě)一個(gè)error_handler腳本吧,確保每次都能獲取到想要的Fatal Error。"


有了這個(gè)腳本,我再按SO上說(shuō)的第四種方法去執(zhí)行,那這個(gè)需求就實(shí)現(xiàn)了!

不負(fù)眾望

王小五興沖沖的找到Z哥,詳細(xì)的說(shuō)明了自己的研究成果。

第二天,小五按照公司現(xiàn)有的框架規(guī)則,結(jié)合上面的解決辦法,不一會(huì)就實(shí)現(xiàn)了需求。

"不錯(cuò)啊,小五,我就說(shuō)你可以吧!" Z哥高興的說(shuō)到。
"哈哈,Z哥,這下所有的錯(cuò)誤都在掌握之中了!"


轉(zhuǎn)載聲明:本文轉(zhuǎn)載自「聊聊代碼」,搜索「talkpoem」即可關(guān)注。

關(guān)注「聊聊代碼」,讓我們一起聊聊“左手代碼右手詩(shī)”的事兒。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/22892.html

相關(guān)文章

  • PHP 錯(cuò)誤與異常

    摘要:但異常捕獲后程序可以繼續(xù)執(zhí)行,而真正的錯(cuò)誤出現(xiàn)后程序就必須終止異常可以使用來(lái)捕獲捕獲,捕獲之后后續(xù)代碼可以繼續(xù)執(zhí)行而錯(cuò)誤是無(wú)法使用捕獲的如果拋出了異常,就必須捕獲它否則程序終止執(zhí)行。 PHP錯(cuò)誤級(jí)別 Parse error > Fatal Error > Waning > Notice > Deprecated Deprecated 最低級(jí)別的錯(cuò)誤(不推薦,不建議)使用一些過(guò)期函數(shù)的...

    longmon 評(píng)論0 收藏0
  • Node 錯(cuò)誤處理之挖坑系列

    摘要:一中的對(duì)象包含了錯(cuò)誤的具體信息,包括錯(cuò)誤堆棧等。不源碼了,特別簡(jiǎn)單,自己去一下。 一. Error ????JS 中的 Error 對(duì)象. 包含了錯(cuò)誤的具體信息,包括 name、message、錯(cuò)誤堆棧 stack 等??梢砸?new Error 方式創(chuàng)建實(shí)例拋出,或調(diào)用 Error.captureStackTrace 為已有對(duì)象添加 stack 錯(cuò)誤堆棧信息 而后拋出showImg(...

    afishhhhh 評(píng)論0 收藏0
  • 上手并過(guò)渡到PHP7(4)——取代fatal error的engine exceptions

    摘要:上手并過(guò)渡到取代的泊學(xué)原文鏈接泊學(xué)代碼秀視頻自從以來(lái),的錯(cuò)誤處理幾乎就是一成不變的。在中,這個(gè)尷尬的現(xiàn)狀,終于被徹底改變了。無(wú)論是還是傳統(tǒng)的,只要類型不匹配約束的時(shí)候,就會(huì)導(dǎo)致異常。 上手并過(guò)渡到PHP7 取代fatal error的engine exceptions 泊學(xué)原文鏈接泊學(xué)代碼秀視頻 自從PHP 4以來(lái),PHP的錯(cuò)誤處理幾乎就是一成不變的。只不過(guò)在PHP 5.0里添加了E_...

    mylxsw 評(píng)論0 收藏0
  • PHP下的異步嘗試一:初識(shí)生成器

    摘要:下的異步嘗試系列下的異步嘗試一初識(shí)生成器下的異步嘗試二初識(shí)協(xié)程下的異步嘗試三協(xié)程的版自動(dòng)執(zhí)行器下的異步嘗試四版的下的異步嘗試五版的的繼續(xù)完善生成器類獲取迭代器當(dāng)前值獲取迭代器當(dāng)前值返回當(dāng)前產(chǎn)生的鍵生成器從上一次處繼續(xù)執(zhí)行重置迭代器向生成器中 PHP下的異步嘗試系列 PHP下的異步嘗試一:初識(shí)生成器 PHP下的異步嘗試二:初識(shí)協(xié)程 PHP下的異步嘗試三:協(xié)程的PHP版thunkify自...

    tomorrowwu 評(píng)論0 收藏0
  • PHP7中異常與錯(cuò)誤處理與之前版本對(duì)比

    先上代碼 ECHO PHP_VERSION.PHP_EOL; function add (int $left,int $right){ return $left+$right; } try { echo add(left, right); } catch (Exception $e) { // Handle exception } catch (Error $e) { //...

    wemallshop 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<