欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

PHP7中使用set_error_handler和set_exception_handler處理異常機(jī)制的示例分析

這篇文章給大家分享的是有關(guān)PHP7中使用set_error_handler和set_exception_handler處理異常機(jī)制的示例分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、成都小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了樺南免費(fèi)建站歡迎大家使用!

由于歷史原因,php一開(kāi)始被設(shè)計(jì)為一門(mén)面向過(guò)程的語(yǔ)言,所以異常處理沒(méi)有使用像Java一樣的 try / catch 機(jī)制,出錯(cuò)時(shí)直接顯示到頁(yè)面上,或者記錄到web服務(wù)器的錯(cuò)誤日志中,并且php的錯(cuò)誤分成了很多的級(jí)別,例如E_ERROR、E_WARNING、E_PARSE、E_NOTICE等等,對(duì)于像E_ERROR、E_PARSE這樣的嚴(yán)重錯(cuò)誤,php會(huì)直接終止腳本的運(yùn)行。

雖然對(duì)于php5版本,我們可以使用set_error_handler來(lái)注冊(cè)自己的錯(cuò)誤處理方法來(lái)代替php的標(biāo)準(zhǔn)錯(cuò)誤處理方式(輸出到頁(yè)面或者記錄到日志),但是一些嚴(yán)重錯(cuò)誤是無(wú)法通過(guò)這種方式來(lái)處理的,具體我們來(lái)看手冊(cè)對(duì)該方法的介紹:

mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )

設(shè)置一個(gè)用戶的函數(shù)(error_handler)來(lái)處理腳本中出現(xiàn)的錯(cuò)誤。 

本函數(shù)可以用你自己定義的方式來(lái)處理運(yùn)行中的錯(cuò)誤, 例如,在應(yīng)用程序中嚴(yán)重錯(cuò)誤發(fā)生時(shí),或者在特定條件下觸發(fā)了一個(gè)錯(cuò)誤(使用 trigger_error()),你需要對(duì)數(shù)據(jù)/文件做清理回收。 

重要的是要記住 error_types 里指定的錯(cuò)誤類型都會(huì)繞過(guò) PHP 標(biāo)準(zhǔn)錯(cuò)誤處理程序, 除非回調(diào)函數(shù)返回了 FALSE。 error_reporting() 設(shè)置將不會(huì)起到作用而你的錯(cuò)誤處理函數(shù)繼續(xù)會(huì)被調(diào)用 —— 不過(guò)你仍然可以獲取 error_reporting 的當(dāng)前值,并做適當(dāng)處理。 需要特別注意的是帶 @ error-control operator 前綴的語(yǔ)句發(fā)生錯(cuò)誤時(shí),這個(gè)值會(huì)是 0。 

同時(shí)注意,在需要時(shí)你有責(zé)任使用 die()。 如果錯(cuò)誤處理程序返回了,腳本將會(huì)繼續(xù)執(zhí)行發(fā)生錯(cuò)誤的后一行。 

以下級(jí)別的錯(cuò)誤不能由用戶定義的函數(shù)來(lái)處理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 調(diào)用 set_error_handler() 函數(shù)所在文件中產(chǎn)生的大多數(shù) E_STRICT。

手冊(cè)上說(shuō)的很清楚,對(duì)于E_ERROR、E_PARSE之類的錯(cuò)誤并不能被用戶處理,我們來(lái)看代碼演示(以下示例用php5.6運(yùn)行)

<?php
 
//自定義的錯(cuò)誤處理方法
function _error_handler($errno, $errstr ,$errfile, $errline)
{
    echo "錯(cuò)誤編號(hào)errno: $errno<br>";
    echo "錯(cuò)誤信息errstr: $errstr<br>";
    echo "出錯(cuò)文件errfile: $errfile<br>";
    echo "出錯(cuò)行號(hào)errline: $errline<br>";
}
 
set_error_handler('_error_handler', E_ALL | E_STRICT);  // 注冊(cè)錯(cuò)誤處理方法來(lái)處理所有錯(cuò)誤
 
 
echo $foo['bar'];  // 由于數(shù)組未定義,會(huì)產(chǎn)生一個(gè)notice級(jí)別的錯(cuò)誤

運(yùn)行結(jié)果:

錯(cuò)誤編號(hào)errno: 8
錯(cuò)誤信息errstr: Undefined variable: foo
出錯(cuò)文件errfile: D:\project\demo\demo.php
出錯(cuò)行號(hào)errline: 16

這時(shí)錯(cuò)誤信息并沒(méi)有像往常一樣直接輸出到頁(yè)面上,而是按照我們自己的方式來(lái)處理了,如果不使用set_error_handler函數(shù),錯(cuò)誤信息會(huì)是常見(jiàn)的這樣展示,當(dāng)然我們可以關(guān)閉掉php的錯(cuò)誤顯示,這樣錯(cuò)誤就不會(huì)直接顯示到頁(yè)面上了。

Notice: Undefined variable: foo in D:\project\demo\demo.php on line 15

這樣的處理機(jī)制看似也還不錯(cuò),但上面提到不是所有錯(cuò)誤都可以這樣處理,修改一下上面的代碼如下:

<?php

//自定義的錯(cuò)誤處理方法
function _error_handler($errno, $errstr ,$errfile, $errline)
{
    echo "錯(cuò)誤編號(hào)errno: $errno<br>";
    echo "錯(cuò)誤信息errstr: $errstr<br>";
    echo "出錯(cuò)文件errfile: $errfile<br>";
    echo "出錯(cuò)行號(hào)errline: $errline<br>";
}

set_error_handler('_error_handler', E_ALL | E_STRICT);  // 注冊(cè)錯(cuò)誤處理方法來(lái)處理所有錯(cuò)誤


echo $foo['bar'];  // 由于數(shù)組未定義,會(huì)產(chǎn)生一個(gè)notice級(jí)別的錯(cuò)誤

trigger_error('人為觸發(fā)一個(gè)錯(cuò)誤', E_USER_ERROR); //人為觸發(fā)錯(cuò)誤

foobar(3, 5);   //調(diào)用未定義的方法將會(huì)產(chǎn)生一個(gè)Error級(jí)別的錯(cuò)誤

再來(lái)運(yùn)行:

錯(cuò)誤編號(hào)errno: 8
錯(cuò)誤信息errstr: Undefined variable: foo
出錯(cuò)文件errfile: D:\project\demo\demo.php
出錯(cuò)行號(hào)errline: 15
錯(cuò)誤編號(hào)errno: 256
錯(cuò)誤信息errstr: 人為產(chǎn)生觸發(fā)一個(gè)錯(cuò)誤
出錯(cuò)文件errfile: D:\project\demo\demo.php
出錯(cuò)行號(hào)errline: 17

Fatal error: Call to undefined function foobar() in D:\project\demo\demo.php on line 19

正如我們所料,前兩個(gè)錯(cuò)誤被我們“捕獲”處理了,而最后的Fatal error并沒(méi)有按照我們注冊(cè)的錯(cuò)誤函數(shù)來(lái)處理,還是使用的默認(rèn)的處理方式,這也是php5版本的錯(cuò)誤處理的一大缺陷。PHP7之后的異常處理方式有了一些新的變化,來(lái)看看手冊(cè)上的介紹:

PHP 7 改變了大多數(shù)錯(cuò)誤的報(bào)告方式。不同于傳統(tǒng)(PHP 5)的錯(cuò)誤報(bào)告機(jī)制,現(xiàn)在大多數(shù)錯(cuò)誤被作為 Error 異常拋出。 

這種 Error 異常可以像 Exception 異常一樣被第一個(gè)匹配的 try / catch 塊所捕獲。如果沒(méi)有匹配的 catch 塊,則調(diào)用異常處理函數(shù)(事先通過(guò) set_exception_handler() 注冊(cè))進(jìn)行處理。 如果尚未注冊(cè)異常處理函數(shù),則按照傳統(tǒng)方式處理:被報(bào)告為一個(gè)致命錯(cuò)誤(Fatal Error)。 

Error 類并非繼承自 Exception 類,所以不能用 catch (Exception $e) { ... } 來(lái)捕獲 Error。你可以用 catch (Error $e) { ... },或者通過(guò)注冊(cè)異常處理函數(shù)( set_exception_handler())來(lái)捕獲 Error。

php7的這種錯(cuò)誤處理機(jī)制有像java學(xué)習(xí)的意味,這樣使得我們可以自己來(lái)處理大多數(shù)的異常,下面看代碼示例(以下代碼使用php7運(yùn)行)

<?php

//自定義的錯(cuò)誤處理方法
function _error_handler($errno, $errstr ,$errfile, $errline)
{
    echo "錯(cuò)誤編號(hào)errno: $errno<br>";
    echo "錯(cuò)誤信息errstr: $errstr<br>";
    echo "出錯(cuò)文件errfile: $errfile<br>";
    echo "出錯(cuò)行號(hào)errline: $errline<br>";
}

set_error_handler('_error_handler', E_ALL | E_STRICT);  // 注冊(cè)錯(cuò)誤處理方法來(lái)處理所有錯(cuò)誤


try
{
    echo $foo['bar'];  // 由于數(shù)組未定義,會(huì)產(chǎn)生一個(gè)notice級(jí)別的錯(cuò)誤

    trigger_error('人為產(chǎn)生觸發(fā)一個(gè)錯(cuò)誤', E_USER_ERROR); //人為觸發(fā)錯(cuò)誤

    foobar(3, 5);   //調(diào)用未定義的方法將會(huì)產(chǎn)生一個(gè)Error級(jí)別的錯(cuò)誤
}
catch (Error $e)
{
    echo "Error code: " . $e->getCode() . '<br>';
    echo "Error message: " . $e->getMessage() . '<br>';
    echo "Error file: " . $e->getFile() . '<br>';
    echo "Error fileline: " . $e->getLine() . '<br>';
}

運(yùn)行結(jié)果:

錯(cuò)誤編號(hào)errno: 8
錯(cuò)誤信息errstr: Undefined variable: foo
出錯(cuò)文件errfile: E:\project\demo\demo.php
出錯(cuò)行號(hào)errline: 17
錯(cuò)誤編號(hào)errno: 256
錯(cuò)誤信息errstr: 人為產(chǎn)生觸發(fā)一個(gè)錯(cuò)誤
出錯(cuò)文件errfile: E:\project\demo\demo.php
出錯(cuò)行號(hào)errline: 19
Error code: 0
Error message: Call to undefined function foobar()
Error file: E:\project\demo\demo.php
Error fileline: 21

這樣不同類型的錯(cuò)誤都可以被我們自己處理了,包括致命錯(cuò)誤。如果不使用 try / catch , php7的報(bào)錯(cuò)信息和php5還是有一些不同:

錯(cuò)誤編號(hào)errno: 8
錯(cuò)誤信息errstr: Undefined variable: foo
出錯(cuò)文件errfile: E:\project\demo\demo.php
出錯(cuò)行號(hào)errline: 17
錯(cuò)誤編號(hào)errno: 256
錯(cuò)誤信息errstr: 人為觸發(fā)一個(gè)錯(cuò)誤
出錯(cuò)文件errfile: E:\project\demo\demo.php
出錯(cuò)行號(hào)errline: 19

Fatal error: Uncaught Error: Call to undefined function foobar() in E:\project\demo\demo.php:21 Stack trace: #0 {main} thrown in E:\project\demo\demo.php on line 21

致命錯(cuò)誤的描述變成: 拋出的一個(gè)Error沒(méi)有被捕獲。

注意這里的catch限定的只能捕獲Error類的錯(cuò)誤,并且手冊(cè)上明確說(shuō)了 Error類并不是Exception類的子類,那我同時(shí)想捕獲代碼中的Exception錯(cuò)誤不是做不到了嗎,請(qǐng)看代碼:

<?php

//自定義的錯(cuò)誤處理方法
function _error_handler($errno, $errstr ,$errfile, $errline)
{
    echo "錯(cuò)誤編號(hào)errno: $errno<br>";
    echo "錯(cuò)誤信息errstr: $errstr<br>";
    echo "出錯(cuò)文件errfile: $errfile<br>";
    echo "出錯(cuò)行號(hào)errline: $errline<br>";
}

set_error_handler('_error_handler', E_ALL | E_STRICT);  // 注冊(cè)錯(cuò)誤處理方法來(lái)處理所有錯(cuò)誤


try
{
    echo $foo['bar'];  // 由于數(shù)組未定義,會(huì)產(chǎn)生一個(gè)notice級(jí)別的錯(cuò)誤

    trigger_error('人為觸發(fā)一個(gè)錯(cuò)誤', E_USER_ERROR); //人為觸發(fā)錯(cuò)誤

    throw new Exception('This is a exception', 400);  //拋出一個(gè)Exception,看是否可以被catch

    foobar(3, 5);   //調(diào)用未定義的方法將會(huì)產(chǎn)生一個(gè)Error級(jí)別的錯(cuò)誤
}
catch (Error $e)
{
    echo "Error code: " . $e->getCode() . '<br>';
    echo "Error message: " . $e->getMessage() . '<br>';
    echo "Error file: " . $e->getFile() . '<br>';
    echo "Error fileline: " . $e->getLine() . '<br>';
}

運(yùn)行結(jié)果:

錯(cuò)誤編號(hào)errno: 8
錯(cuò)誤信息errstr: Undefined variable: foo
出錯(cuò)文件errfile: E:\project\demo\demo.php
出錯(cuò)行號(hào)errline: 17
錯(cuò)誤編號(hào)errno: 256
錯(cuò)誤信息errstr: 人為觸發(fā)一個(gè)錯(cuò)誤
出錯(cuò)文件errfile: E:\project\demo\demo.php
出錯(cuò)行號(hào)errline: 19

Fatal error: Uncaught Exception: This is a exception in E:\project\demo\demo.php:21 Stack trace: #0 {main} thrown in E:\project\demo\demo.php on line 21

那有沒(méi)有什么辦法呢,其實(shí)看手冊(cè)上的繼承關(guān)系圖

PHP7中使用set_error_handler和set_exception_handler處理異常機(jī)制的示例分析

可以看出,Error類和Exception類都是Throwable的子類(實(shí)際上是Error類和Exception類都實(shí)現(xiàn)了Throwable接口),所以上面的代碼可以優(yōu)化為:

<?php

//自定義的錯(cuò)誤處理方法
function _error_handler($errno, $errstr ,$errfile, $errline)
{
    echo "錯(cuò)誤編號(hào)errno: $errno<br>";
    echo "錯(cuò)誤信息errstr: $errstr<br>";
    echo "出錯(cuò)文件errfile: $errfile<br>";
    echo "出錯(cuò)行號(hào)errline: $errline<br>";
}

set_error_handler('_error_handler', E_ALL | E_STRICT);  // 注冊(cè)錯(cuò)誤處理方法來(lái)處理所有錯(cuò)誤


try
{
    echo $foo['bar'];  // 由于數(shù)組未定義,會(huì)產(chǎn)生一個(gè)notice級(jí)別的錯(cuò)誤

    trigger_error('人為觸發(fā)一個(gè)錯(cuò)誤', E_USER_ERROR); //人為觸發(fā)錯(cuò)誤

    if (mt_rand(1, 10) > 5)
    {
        throw new Exception('This is a exception', 400);  //拋出一個(gè)Exception,看是否可以被catch
    }
    else
    {
        foobar(3, 5);   //調(diào)用未定義的方法將會(huì)產(chǎn)生一個(gè)Error級(jí)別的錯(cuò)誤
    }
}
catch (Throwable $e)
{
    echo "Error code: " . $e->getCode() . '<br>';
    echo "Error message: " . $e->getMessage() . '<br>';
    echo "Error file: " . $e->getFile() . '<br>';
    echo "Error fileline: " . $e->getLine() . '<br>';
}

多次運(yùn)行可以看到,不管是Exception異常還是Error異常,都可以被捕獲處理了。

如果不想所有的錯(cuò)誤都用 try / catch 處理,還可以使用set_exception_handler注冊(cè)異常處理函數(shù),這樣當(dāng)有未被catch的異常產(chǎn)生時(shí),系統(tǒng)會(huì)為我們自動(dòng)調(diào)用注冊(cè)的處理函數(shù)來(lái)處理。

<?php

//自定義的錯(cuò)誤處理方法
function _error_handler($errno, $errstr ,$errfile, $errline)
{
    echo "錯(cuò)誤編號(hào)errno: $errno<br>";
    echo "錯(cuò)誤信息errstr: $errstr<br>";
    echo "出錯(cuò)文件errfile: $errfile<br>";
    echo "出錯(cuò)行號(hào)errline: $errline<br>";
}

set_error_handler('_error_handler', E_ALL | E_STRICT);  // 注冊(cè)錯(cuò)誤處理方法來(lái)處理所有錯(cuò)誤

function _exception_handler(Throwable $e)
{
    if ($e instanceof Error)
    {
        echo "catch Error: " . $e->getCode() . '   ' . $e->getMessage() . '<br>';
    }
    else
    {
        echo "catch Exception: " . $e->getCode() . '   ' . $e->getMessage() . '<br>';
    }
}

set_exception_handler('_exception_handler');    // 注冊(cè)異常處理方法來(lái)捕獲異常


echo $foo['bar'];  // 由于數(shù)組未定義,會(huì)產(chǎn)生一個(gè)notice級(jí)別的錯(cuò)誤

trigger_error('人為觸發(fā)一個(gè)錯(cuò)誤', E_USER_ERROR); //人為觸發(fā)錯(cuò)誤

if (mt_rand(1, 10) > 5)
{
    throw new Exception('This is a exception', 400);  //拋出一個(gè)Exception,看是否可以被catch
}
else
{
    foobar(3, 5);   //調(diào)用未定義的方法將會(huì)產(chǎn)生一個(gè)Error級(jí)別的錯(cuò)誤
}
錯(cuò)誤編號(hào)errno: 8
錯(cuò)誤信息errstr: Undefined variable: foo
出錯(cuò)文件errfile: E:\project\demo\demo.php
出錯(cuò)行號(hào)errline: 29
錯(cuò)誤編號(hào)errno: 256
錯(cuò)誤信息errstr: 人為觸發(fā)一個(gè)錯(cuò)誤
出錯(cuò)文件errfile: E:\project\demo\demo.php
出錯(cuò)行號(hào)errline: 31
catch Error: 0 Call to undefined function foobar()


錯(cuò)誤編號(hào)errno: 8
錯(cuò)誤信息errstr: Undefined variable: foo
出錯(cuò)文件errfile: E:\project\demo\demo.php
出錯(cuò)行號(hào)errline: 29
錯(cuò)誤編號(hào)errno: 256
錯(cuò)誤信息errstr: 人為觸發(fā)一個(gè)錯(cuò)誤
出錯(cuò)文件errfile: E:\project\demo\demo.php
出錯(cuò)行號(hào)errline: 31
catch Exception: 400 This is a exception

這時(shí)我們可能又會(huì)被PHP7弄暈,哪些被set_error_handler處理,哪些被set_exception_handler處理,手冊(cè)上也沒(méi)有明確說(shuō)明這塊,根據(jù)我的總結(jié),大致上不會(huì)導(dǎo)致腳本終止運(yùn)行的錯(cuò)誤會(huì)被set_error_handler處理,而會(huì)終止腳本運(yùn)行的嚴(yán)重錯(cuò)誤會(huì)被當(dāng)作Error拋出,但不是絕對(duì),上面人為觸發(fā)的

E_USER_ERROR就是一個(gè)會(huì)打斷腳本運(yùn)行的錯(cuò)誤,但是并沒(méi)有當(dāng)作Error異常拋出,而是交由set_error_handler注冊(cè)的方法處理,這可能是因?yàn)檫@類錯(cuò)誤是我們自己人為產(chǎn)生的有關(guān),所以PHP7的錯(cuò)誤處理還是有一些含糊不清,對(duì)于我們自己處理時(shí)要多加小心。

感謝各位的閱讀!關(guān)于“PHP7中使用set_error_handler和set_exception_handler處理異常機(jī)制的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

本文題目:PHP7中使用set_error_handler和set_exception_handler處理異常機(jī)制的示例分析
標(biāo)題來(lái)源:http://aaarwkj.com/article16/goopgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣小程序開(kāi)發(fā)、面包屑導(dǎo)航、網(wǎng)站內(nèi)鏈、網(wǎng)站設(shè)計(jì)ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)
色综合天天综合天天更新| 国产男女做爰在线视频| 熟女中文字幕一区二区| 国产成人午夜视频免费一区| 一区二区在线视频国产| 欧美色视频综合在线观看| 亚洲第六页亚洲第一页| 一区二区亚洲欧美精品| 不卡视频在线免费观看| 色婷婷亚洲婷婷亚洲最大| 久久超碰一区二区三区| 日本一区二区三区高清在线| 国产欧美成人综合色就色| 日本一区不卡二区高清| 国产精品一区二区三区国产| 真人国产一级美女免费视频| 国产毛片一区二区在线| 男人喜欢看的免费视频| 国产传媒在线播放一区| 亚洲国际精品女人乱码| 欧美大片免费在线播放| 黄片色呦呦视频免费看| 日本在线观看免费高清| 亚洲熟乱熟女一区二区| 日本熟人妻中文字幕在线| 麻豆国产传媒片在线观看| 中文字幕精品高清中国| 国产免费av剧情演绎| 人妻天天爽夜夜爽欧美色| 亚洲国产精品自拍第一页| 国内精品人妻久久毛片| 久久久国产精品久久久| 色哟哟网站在线精品视频| 无人视频在线观看高清91| 国产精品黄色91熟女| 日本精品亚洲一区二区三区| 亚洲精品国产熟女av| 日本黄网色三级三级三级| 热九九这里只有热九九| 国产亚洲精品视频热| 一起草草视频在线观看|