php異常處理 之 BooBoo庫介紹

本文介紹php開源庫BooBoo简僧,是一個處理php異常和錯誤的開源庫,通過簡單的分析代碼,我們知道了實(shí)際項(xiàng)目中怎么正確的設(shè)置錯誤和異常料饥。

這是php異常系列的第二篇,第一篇地址是:

如何組織PHP中的異常

基本概念

php中的異常和錯誤是不一樣的朱监,錯誤英文單詞是error岸啡,異常英文單詞是exception。異常一般指出現(xiàn)正常邏輯之外的情況赫编,而錯誤是指運(yùn)行時發(fā)生了不可恢復(fù)的故障巡蘸,比如使用了未定義的變量奋隶,或者語法錯誤等。異常我們通過throw拋出悦荒,catch進(jìn)行捕獲唯欣,而錯誤一般發(fā)生程序就會終止,我們可以通過trigger_error觸發(fā)用戶級錯誤逾冬,然后通過set_error_handler設(shè)置處理函數(shù)黍聂,下面看段代碼:

set_error_handler('errorHandler');
trigger_error("這里描述錯誤",E_USER_ERROR);
//E_USER_ERROR:該error 所特定的錯誤類型躺苦,默認(rèn)是E_USER_NOTICE
function errorHandler($errno,$errstr){
    //用戶的函數(shù)需要接受兩個參數(shù):錯誤碼和描述錯誤的 string
    if($errno==E_USER_ERROR){
        echo "錯誤為:",$errstr.'<br>';
    }
}

運(yùn)行后就會通過我們設(shè)定的errorHandler輸出錯誤身腻。

如果我們沒有設(shè)定errorHandler,而且我們是在控制臺中運(yùn)行的腳本匹厘,那就會出現(xiàn)錯誤信息嘀趟,

PHP Fatal error: 這里描述錯誤 in /Users/zhuanxu/workspace/php-exceptions/error.php on line 4

那我們怎么能夠在生產(chǎn)環(huán)境中去除這些信息呢?

php.ini中有兩個參數(shù)與錯誤有關(guān)愈诚,一個是display_errors她按,另一個是error_reporting,其中display_errors控制著是否將錯誤信息輸出到控制臺炕柔,而error_reporting則控制著錯誤報(bào)告級別酌泰。

講完這些,我們下面將開始分析BooBoo匕累,來看看實(shí)際項(xiàng)目中怎么處理錯誤和異常陵刹。

BooBoo介紹

此處我們通過庫BooBoo來進(jìn)行學(xué)習(xí)。

BooBoo的設(shè)計(jì)原則是:如果Errors是fatal的欢嘿,那就按fatal處理衰琐,如果Errors不是Fatal的,則讓程序繼續(xù)執(zhí)行炼蹦。

在錯誤的處理上羡宙,我們希望能夠在實(shí)際生產(chǎn)中處理錯誤,但是只在開發(fā)環(huán)境中才展示出這些錯誤信息掐隐,因此BooBoo在設(shè)計(jì)上有兩個重要的概念:Handler狗热,F(xiàn)ormatter。

  • Handler做的事情就是針對錯誤執(zhí)行一個操作虑省,可能是記錄日志斗搞,可能是發(fā)送錯誤給報(bào)警器。
  • Formatter則是將錯誤變?yōu)榭砷喿x的錯誤信息慷妙。

另外當(dāng)設(shè)置display_errors關(guān)閉的時候僻焚,不會執(zhí)行Formatter操作,當(dāng)然BooBoo也支持你自己針對錯誤自己制定Formatter膝擂。

代碼結(jié)構(gòu):

├── Exception
│   └── NoFormattersRegisteredException.php
├── Formatter
│   ├── AbstractFormatter.php
│   ├── CommandLineFormatter.php
│   ├── FormatterInterface.php
│   ├── HtmlFormatter.php
│   ├── HtmlTableFormatter.php
│   ├── JsonFormatter.php
│   └── NullFormatter.php
├── Handler
│   ├── HandlerInterface.php
│   ├── LogHandler.php
│   └── RavenHandler.php
├── Runner.php
└── Util
    ├── Frame.php
    ├── FrameCollection.php
    └── Inspector.php

頂層是Runner.php虑啤,下面是重要的兩個目錄:Formatter和Handler隙弛,還有輔助函數(shù)Util,以及異常Exception狞山。

我們先看使用方式

安裝

$ composer require league/booboo

新建booboo.php

use League\BooBoo\Formatter\CommandLineFormatter;
use League\BooBoo\Runner;

require_once __DIR__ . "/vendor/autoload.php";


$runner = new Runner();
$runner->pushFormatter(new CommandLineFormatter());
$runner->register(); // Registers the handlers

echo $cc;

執(zhí)行后輸出:

+--------+
| NOTICE |
+--------+
Undefined variable: cc in /Users/zhuanxu/workspace/php-exceptions/booboo.php on line 12

有了使用的感性認(rèn)識后全闷,我們看看究竟發(fā)生了什么。

League\BooBoo\Runner的構(gòu)造函數(shù)中:

public function __construct(array $formatters = [], array $handlers = []);

可以設(shè)置formatters和handlers萍启,然后在register函數(shù)中总珠,

//==> 關(guān)閉錯誤展示,設(shè)置3個處理函數(shù)
// We want the formaters we register to handle the errors.
ini_set('display_errors', false);

set_error_handler(array($this, self::ERROR_HANDLER));
set_exception_handler(array($this, self::EXCEPTION_HANDLER));
register_shutdown_function(array($this, self::SHUTDOWN_HANDLER));

通過3個注冊函數(shù)注冊了處理的函數(shù)勘纯。當(dāng)異常發(fā)生的時候局服,調(diào)用exceptionHandler函數(shù)

里面會挨個調(diào)用用戶注冊的handlers,如果用戶沒有關(guān)閉錯誤顯示驳遵,會通過formatters處理后直接打印出來淫奔,但是如果關(guān)閉了錯誤顯示,則會返回給瀏覽器堤结。

此處看下register_shutdown_function函數(shù)唆迁,其注冊的函數(shù)調(diào)用條件是:

1、當(dāng)頁面被用戶強(qiáng)制停止時

2竞穷、當(dāng)程序代碼運(yùn)行超時時

3唐责、當(dāng)PHP代碼執(zhí)行完成時,代碼執(zhí)行存在異常和錯誤瘾带、警告

在函數(shù)shutdownHandler中:我們關(guān)閉了拋出異常鼠哥,然后判斷是否有錯誤發(fā)生,有則進(jìn)行錯誤處理月弛。

public function shutdownHandler()
    {
        // We can't throw exceptions in the shutdown handler.
        $this->treatErrorsAsExceptions(false);

        $error = error_get_last();
        if ($error && $error['type'] & $this->fatalErrors) {
            $this->errorHandler(
                $error['type'],
                $error['message'],
                $error['file'],
                $error['line']
            );
        }
    }

最后我們看下錯誤處理函數(shù)肴盏,在里面我們會判斷錯誤是否是致命錯誤,如果是則進(jìn)行處理帽衙,否則按照異常處理菜皂。

BooBoo庫的介紹就到這了,通過BooBoo我們能很方便的對異常和錯誤進(jìn)行統(tǒng)一處理厉萝,非常方便我們平常的開發(fā)恍飘,下一篇我們將再看看Whoops庫,也是一個錯誤處理的函數(shù)谴垫,再平時開發(fā)中用到的很多章母。

這是 php異常系列 的第二篇,你的鼓勵是我繼續(xù)寫下去的動力翩剪,期待我們共同進(jìn)步乳怎。

參考

PHP異常、錯誤處理機(jī)制筆記

Introducing a new error handler for PHP projects

register_shutdown_function 函數(shù)詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末前弯,一起剝皮案震驚了整個濱河市蚪缀,隨后出現(xiàn)的幾起案子秫逝,更是在濱河造成了極大的恐慌,老刑警劉巖询枚,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件违帆,死亡現(xiàn)場離奇詭異,居然都是意外死亡金蜀,警方通過查閱死者的電腦和手機(jī)刷后,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渊抄,“玉大人尝胆,你說我怎么就攤上這事∈阆撸” “怎么了班巩?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵渣慕,是天一觀的道長嘶炭。 經(jīng)常有香客問我,道長逊桦,這世上最難降的妖魔是什么眨猎? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮强经,結(jié)果婚禮上睡陪,老公的妹妹穿的比我還像新娘。我一直安慰自己匿情,他們只是感情好兰迫,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著炬称,像睡著了一般汁果。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玲躯,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天据德,我揣著相機(jī)與錄音,去河邊找鬼跷车。 笑死棘利,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的朽缴。 我是一名探鬼主播善玫,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼密强!你這毒婦竟也來了茅郎?” 一聲冷哼從身側(cè)響起裹唆,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎只洒,沒想到半個月后许帐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毕谴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年成畦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涝开。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡循帐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舀武,到底是詐尸還是另有隱情拄养,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布银舱,位于F島的核電站瘪匿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寻馏。R本人自食惡果不足惜棋弥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诚欠。 院中可真熱鬧顽染,春花似錦、人聲如沸轰绵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽左腔。三九已至唧垦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翔悠,已是汗流浹背业崖。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蓄愁,地道東北人双炕。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像撮抓,于是被迫代替她去往敵國和親妇斤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 本文的主題是怎么組織php的異常?在大型項(xiàng)目中異常往往被我們忽略站超,但是如果前期沒有很好的規(guī)劃好荸恕,越到項(xiàng)目后期,重構(gòu)...
    小聰明李良才閱讀 1,964評論 14 12
  • php usleep() 函數(shù)延遲代碼執(zhí)行若干微秒死相。 unpack() 函數(shù)從二進(jìn)制字符串對數(shù)據(jù)進(jìn)行解包融求。 uni...
    思夢PHP閱讀 1,981評論 1 24
  • php.ini設(shè)置,上傳大文件: post_max_size = 128Mupload_max_filesize ...
    bycall閱讀 6,736評論 3 64
  • PHP常用函數(shù)大全 usleep() 函數(shù)延遲代碼執(zhí)行若干微秒。 unpack() 函數(shù)從二進(jìn)制字符串對數(shù)據(jù)進(jìn)行解...
    上街買菜丶迷倒老太閱讀 1,352評論 0 20
  • “離開農(nóng)村”成了幾乎所有人的共識和努力的方向,父母對孩子講得最多的是“好好學(xué)習(xí)肮柜,否則就只能當(dāng)農(nóng)民”;教師教育學(xué)生也...
    養(yǎng)殖先生閱讀 872評論 0 2