摘要:我們?cè)诖颂幹苯佑弥苯虞敵鲆男畔⒓纯?,于是有了下面的代碼解釋直接在組織和輸出錯(cuò)誤信息即可完成自定義錯(cuò)誤信息的輸出,這樣簡(jiǎn)單了很多,加上這段代碼后以后如果出問(wèn)題直接去里面查找就可拿到所需的信息,定位到問(wèn)題所在。
前幾天公司平臺(tái)接入了新的合作商,數(shù)據(jù)抓取服務(wù)一直沒(méi)問(wèn)題,到今天有一本書(shū)一直報(bào)錯(cuò),查看log發(fā)現(xiàn)Warning,出錯(cuò)是由于導(dǎo)致xml解析錯(cuò)誤。想到輸出一下具體的bookid和chapter_id來(lái)查看到底是哪本書(shū)哪個(gè)章節(jié)的問(wèn)題。
直接想到的方案是try catch在出錯(cuò)的時(shí)候輸出bookid和chapter_id,但是發(fā)現(xiàn)php try catch無(wú)法處理Warning錯(cuò)誤,于是Google了php如何catch warning,在stackoverflow上找到了如下方法:http://stackoverflow.com/questions/1241728/can-i-try-catch-a-warning
大致的意思是通過(guò) set_error_handler來(lái)自定義處理Warning的方法,在其中拋出一個(gè)異常然后再try catch它輸出bookid和chapter_id,基本照抄給的實(shí)例于是如下的代碼:
phpset_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) { // error was suppressed with the @-operator if (0 === error_reporting()) { return false; } throw new ErrorException($errstr, 0, $errno, $errfile, $errline); }, E_WARNING); try{ $chapter_content = simplexml_load_string($chaptercontent_xml); } catch (Exception $e) { echo "Caught exception: bookid = $id , chapter_id = $chapter_id ", $e->getMessage(), " "; exit(); } restore_error_handler();
解釋?zhuān)菏褂胹et_error_handler來(lái)接管warning的處理,在其回調(diào)函數(shù)中拋出一個(gè)Exception,然后就可以try catch了,最后調(diào)用restore_error_handler();來(lái)撤銷(xiāo)你設(shè)置的error_handler從而使其不影響后續(xù)的代碼。
思考:這樣改完后確實(shí)得到了bookid和chapter_id,但是有沒(méi)有別的更簡(jiǎn)單方法來(lái)實(shí)現(xiàn),其實(shí)我最本質(zhì)的需求就是要自定義輸出的Warning消息使其在輸出錯(cuò)誤的時(shí)候帶上bookid和chapter_id上面的方法雖然解決了這個(gè)問(wèn)題但是繞了一個(gè)大圈。查看php手冊(cè)上set_error_handler的詳細(xì)用法發(fā)現(xiàn):
errcontext
第五個(gè)可選參數(shù), errcontext, 是一個(gè)指向錯(cuò)誤發(fā)生時(shí)活動(dòng)符號(hào)表的 array。 也就是說(shuō),errcontext 會(huì)包含錯(cuò)誤觸發(fā)處作用域內(nèi)所有變量的數(shù)組。 用戶(hù)的錯(cuò)誤處理程序不應(yīng)該修改錯(cuò)誤上下文(context)。
我們?cè)诖颂幹苯佑胑rrcontext直接輸出要的信息即可,于是有了下面的代碼:
phpset_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext){ // error was suppressed with the @-operator if (0 === error_reporting()) { return false; } echo "Caught Waring:bookid=$errcontext[bookid],chapter_id=$errcontext[chapter_id] Waring Message:",$errstr," in ",$errfile," on line ",$errline," "; }, E_WARNING); $chapter_content = simplexml_load_string($chaptercontent_xml); restore_error_handler();
解釋?zhuān)褐苯釉趕et_error_handler組織和輸出錯(cuò)誤信息即可完成自定義Warning錯(cuò)誤信息的輸出,這樣簡(jiǎn)單了很多,加上這段代碼后以后如果出問(wèn)題直接去log里面查找就可拿到所需的信息,定位到問(wèn)題所在。
總結(jié):在解決完一個(gè)問(wèn)題是最好多想想這個(gè)問(wèn)題的本質(zhì),有沒(méi)有更好的解決方案,這才能不斷進(jìn)步。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/31915.html
摘要:又或者反過(guò)來(lái),把錯(cuò)誤當(dāng)成異常來(lái)處理。當(dāng)然,我猜它的目的,應(yīng)該也是為了能實(shí)現(xiàn)錯(cuò)誤與異常之間優(yōu)雅轉(zhuǎn)換而添加的。至此,錯(cuò)誤與異常的學(xué)習(xí)基本完畢。 這話(huà)題已經(jīng)沒(méi)有什么新意了,這里只是做做筆記,作為思路的一種整理,也以便后續(xù)忘了可以回來(lái)這里查找。 錯(cuò)誤 以下是 PHP 最常見(jiàn)的幾種錯(cuò)誤: // E_NOTICE echo $a; // E_WARNING echo 100 / 0; clas...
摘要:至,有同樣的行為。表示關(guān)閉所有錯(cuò)誤報(bào)告表示顯示二函數(shù)說(shuō)明設(shè)置應(yīng)該報(bào)告何種錯(cuò)誤說(shuō)明函數(shù)能夠在運(yùn)行時(shí)設(shè)置指令。后果是導(dǎo)致腳本終止不再繼續(xù)運(yùn)行。初始化啟動(dòng)過(guò)程中發(fā)生的警告非致命錯(cuò)誤。用戶(hù)產(chǎn)少的警告信息。出外的所有錯(cuò)誤和警告信息。 錯(cuò)誤報(bào)告級(jí)別:指定了在什么情況下,腳本代碼中的錯(cuò)誤(這里的錯(cuò)誤是廣義的錯(cuò)誤,包括E_NOTICE注意、E_WARNING警告、E_ERROR致命錯(cuò)誤等)會(huì)以錯(cuò)誤報(bào)告...
小編寫(xiě)這篇文章的主要目的,就是給大家介紹下關(guān)于在Python中,有內(nèi)置的logging,那么,我們?cè)谶M(jìn)行使用它的時(shí)候,有什么使用方法呢?下面就給大家詳細(xì)介紹?! ogging的主要作用 它的作用是給日志記錄的接口和眾多處理模塊,供用戶(hù)存儲(chǔ)各種格式的日志,幫助調(diào)試程序或者記錄程序運(yùn)行過(guò)程中的輸出信息?! ogging日志等級(jí) logging日志等級(jí)分為五個(gè)等級(jí),優(yōu)先級(jí)從高到低依次是: ...
摘要:如何構(gòu)建一個(gè)自己的框架為什么我們要去構(gòu)建一個(gè)自己的框架可能絕大多數(shù)的人都會(huì)說(shuō)市面上已經(jīng)那么多的框架了,還造什么輪子。 showImg(https://segmentfault.com/img/bVNg9F?w=500&h=500); 如何構(gòu)建一個(gè)自己的PHP框架 為什么我們要去構(gòu)建一個(gè)自己的PHP框架?可能絕大多數(shù)的人都會(huì)說(shuō)市面上已經(jīng)那么多的框架了,還造什么輪子?。我的觀點(diǎn)造輪子不是目...
閱讀 2879·2021-09-01 10:30
閱讀 1734·2019-08-30 15:52
閱讀 1045·2019-08-29 18:40
閱讀 1205·2019-08-28 18:30
閱讀 2451·2019-08-23 17:19
閱讀 1401·2019-08-23 16:25
閱讀 2802·2019-08-23 16:18
閱讀 3058·2019-08-23 13:53