成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

php自定義Warning的輸出信息

yanbingyun1990 / 1226人閱讀

摘要:我們?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ān)文章

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

    摘要:又或者反過(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...

    kyanag 評(píng)論0 收藏0
  • php error_reporting()關(guān)閉報(bào)錯(cuò)

    摘要:至,有同樣的行為。表示關(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)告...

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

      小編寫(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í)從高到低依次是:  ...

    89542767 評(píng)論0 收藏0
  • 從0開(kāi)始構(gòu)建一個(gè)屬于你PHP框架

    摘要:如何構(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)造輪子不是目...

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

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

0條評(píng)論

閱讀需要支付1元查看
<