成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

php自定義Warning的輸出信息

yanbingyun1990 / 1177人閱讀

摘要:我們在此處直接用直接輸出要的信息即可,于是有了下面的代碼解釋直接在組織和輸出錯誤信息即可完成自定義錯誤信息的輸出,這樣簡單了很多,加上這段代碼后以后如果出問題直接去里面查找就可拿到所需的信息,定位到問題所在。

前幾天公司平臺接入了新的合作商,數(shù)據(jù)抓取服務(wù)一直沒問題,到今天有一本書一直報錯,查看log發(fā)現(xiàn)Warning,出錯是由于導致xml解析錯誤。想到輸出一下具體的bookid和chapter_id來查看到底是哪本書哪個章節(jié)的問題。

直接想到的方案是try catch在出錯的時候輸出bookid和chapter_id,但是發(fā)現(xiàn)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的處理,在其回調(diào)函數(shù)中拋出一個Exception,然后就可以try catch了,最后調(diào)用restore_error_handler();來撤銷你設(shè)置的error_handler從而使其不影響后續(xù)的代碼。

思考:這樣改完后確實得到了bookid和chapter_id,但是有沒有別的更簡單方法來實現(xiàn),其實我最本質(zhì)的需求就是要自定義輸出的Warning消息使其在輸出錯誤的時候帶上bookid和chapter_id上面的方法雖然解決了這個問題但是繞了一個大圈。查看php手冊上set_error_handler的詳細用法發(fā)現(xiàn):

  

errcontext
第五個可選參數(shù), errcontext, 是一個指向錯誤發(fā)生時活動符號表的 array。 也就是說,errcontext 會包含錯誤觸發(fā)處作用域內(nèi)所有變量的數(shù)組。 用戶的錯誤處理程序不應(yīng)該修改錯誤上下文(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里面查找就可拿到所需的信息,定位到問題所在。

總結(jié):在解決完一個問題是最好多想想這個問題的本質(zhì),有沒有更好的解決方案,這才能不斷進步。

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31915.html

相關(guān)文章

  • 如何處理 PHP 錯誤與異常(筆記)

    摘要:又或者反過來,把錯誤當成異常來處理。當然,我猜它的目的,應(yīng)該也是為了能實現(xiàn)錯誤與異常之間優(yōu)雅轉(zhuǎn)換而添加的。至此,錯誤與異常的學習基本完畢。 這話題已經(jīng)沒有什么新意了,這里只是做做筆記,作為思路的一種整理,也以便后續(xù)忘了可以回來這里查找。 錯誤 以下是 PHP 最常見的幾種錯誤: // E_NOTICE echo $a; // E_WARNING echo 100 / 0; clas...

    kyanag 評論0 收藏0
  • php error_reporting()關(guān)閉報錯

    摘要:至,有同樣的行為。表示關(guān)閉所有錯誤報告表示顯示二函數(shù)說明設(shè)置應(yīng)該報告何種錯誤說明函數(shù)能夠在運行時設(shè)置指令。后果是導致腳本終止不再繼續(xù)運行。初始化啟動過程中發(fā)生的警告非致命錯誤。用戶產(chǎn)少的警告信息。出外的所有錯誤和警告信息。 錯誤報告級別:指定了在什么情況下,腳本代碼中的錯誤(這里的錯誤是廣義的錯誤,包括E_NOTICE注意、E_WARNING警告、E_ERROR致命錯誤等)會以錯誤報告...

    noONE 評論0 收藏0
  • Python內(nèi)置logging詳細使用方法介紹

      小編寫這篇文章的主要目的,就是給大家介紹下關(guān)于在Python中,有內(nèi)置的logging,那么,我們在進行使用它的時候,有什么使用方法呢?下面就給大家詳細介紹。  logging的主要作用  它的作用是給日志記錄的接口和眾多處理模塊,供用戶存儲各種格式的日志,幫助調(diào)試程序或者記錄程序運行過程中的輸出信息?! ogging日志等級  logging日志等級分為五個等級,優(yōu)先級從高到低依次是:  ...

    89542767 評論0 收藏0
  • 從0開始構(gòu)建一個屬于你PHP框架

    摘要:如何構(gòu)建一個自己的框架為什么我們要去構(gòu)建一個自己的框架可能絕大多數(shù)的人都會說市面上已經(jīng)那么多的框架了,還造什么輪子。 showImg(https://segmentfault.com/img/bVNg9F?w=500&h=500); 如何構(gòu)建一個自己的PHP框架 為什么我們要去構(gòu)建一個自己的PHP框架?可能絕大多數(shù)的人都會說市面上已經(jīng)那么多的框架了,還造什么輪子?。我的觀點造輪子不是目...

    vpants 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<