摘要:我們在此處直接用直接輸出要的信息即可,于是有了下面的代碼解釋直接在組織和輸出錯誤信息即可完成自定義錯誤信息的輸出,這樣簡單了很多,加上這段代碼后以后如果出問題直接去里面查找就可拿到所需的信息,定位到問題所在。
前幾天公司平臺接入了新的合作商,數據抓取服務一直沒問題,到今天有一本書一直報錯,查看log發現Warning,出錯是由于導致xml解析錯誤。想到輸出一下具體的bookid和chapter_id來查看到底是哪本書哪個章節的問題。
直接想到的方案是try catch在出錯的時候輸出bookid和chapter_id,但是發現php try catch無法處理Warning錯誤,于是Google了php如何catch warning,在stackoverflow上找到了如下方法:http://stackoverflow.com/questions/1241728/can-i-try-catch-a-warning
大致的意思是通過 set_error_handler來自定義處理Warning的方法,在其中拋出一個異常然后再try catch它輸出bookid和chapter_id,基本照抄給的實例于是如下的代碼:
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();
解釋:使用set_error_handler來接管warning的處理,在其回調函數中拋出一個Exception,然后就可以try catch了,最后調用restore_error_handler();來撤銷你設置的error_handler從而使其不影響后續的代碼。
思考:這樣改完后確實得到了bookid和chapter_id,但是有沒有別的更簡單方法來實現,其實我最本質的需求就是要自定義輸出的Warning消息使其在輸出錯誤的時候帶上bookid和chapter_id上面的方法雖然解決了這個問題但是繞了一個大圈。查看php手冊上set_error_handler的詳細用法發現:
errcontext
第五個可選參數, errcontext, 是一個指向錯誤發生時活動符號表的 array。 也就是說,errcontext 會包含錯誤觸發處作用域內所有變量的數組。 用戶的錯誤處理程序不應該修改錯誤上下文(context)。
我們在此處直接用errcontext直接輸出要的信息即可,于是有了下面的代碼:
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();
解釋:直接在set_error_handler組織和輸出錯誤信息即可完成自定義Warning錯誤信息的輸出,這樣簡單了很多,加上這段代碼后以后如果出問題直接去log里面查找就可拿到所需的信息,定位到問題所在。
總結:在解決完一個問題是最好多想想這個問題的本質,有沒有更好的解決方案,這才能不斷進步。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31915.html
摘要:又或者反過來,把錯誤當成異常來處理。當然,我猜它的目的,應該也是為了能實現錯誤與異常之間優雅轉換而添加的。至此,錯誤與異常的學習基本完畢。 這話題已經沒有什么新意了,這里只是做做筆記,作為思路的一種整理,也以便后續忘了可以回來這里查找。 錯誤 以下是 PHP 最常見的幾種錯誤: // E_NOTICE echo $a; // E_WARNING echo 100 / 0; clas...
摘要:至,有同樣的行為。表示關閉所有錯誤報告表示顯示二函數說明設置應該報告何種錯誤說明函數能夠在運行時設置指令。后果是導致腳本終止不再繼續運行。初始化啟動過程中發生的警告非致命錯誤。用戶產少的警告信息。出外的所有錯誤和警告信息。 錯誤報告級別:指定了在什么情況下,腳本代碼中的錯誤(這里的錯誤是廣義的錯誤,包括E_NOTICE注意、E_WARNING警告、E_ERROR致命錯誤等)會以錯誤報告...
小編寫這篇文章的主要目的,就是給大家介紹下關于在Python中,有內置的logging,那么,我們在進行使用它的時候,有什么使用方法呢?下面就給大家詳細介紹。 logging的主要作用 它的作用是給日志記錄的接口和眾多處理模塊,供用戶存儲各種格式的日志,幫助調試程序或者記錄程序運行過程中的輸出信息。 logging日志等級 logging日志等級分為五個等級,優先級從高到低依次是: ...
摘要:如何構建一個自己的框架為什么我們要去構建一個自己的框架可能絕大多數的人都會說市面上已經那么多的框架了,還造什么輪子。 showImg(https://segmentfault.com/img/bVNg9F?w=500&h=500); 如何構建一個自己的PHP框架 為什么我們要去構建一個自己的PHP框架?可能絕大多數的人都會說市面上已經那么多的框架了,還造什么輪子?。我的觀點造輪子不是目...
閱讀 2784·2021-09-01 10:30
閱讀 1679·2019-08-30 15:52
閱讀 964·2019-08-29 18:40
閱讀 1115·2019-08-28 18:30
閱讀 2391·2019-08-23 17:19
閱讀 1321·2019-08-23 16:25
閱讀 2699·2019-08-23 16:18
閱讀 2977·2019-08-23 13:53