溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

php的錯(cuò)誤處理函數(shù)怎么用

發(fā)布時(shí)間:2022-03-18 15:37:12 來(lái)源:億速云 閱讀:110 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹了php的錯(cuò)誤處理函數(shù)怎么用的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇php的錯(cuò)誤處理函數(shù)怎么用文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

set_error_handler()

首先是大家可能會(huì)接觸過(guò)的一個(gè)函數(shù),它可以用來(lái)捕獲一些錯(cuò)誤的信息。如果我們需要統(tǒng)一處理一些錯(cuò)誤,比如規(guī)定日志格式或者將錯(cuò)誤信息發(fā)送到郵件中,一般會(huì)在入口文件的開(kāi)頭在全局范圍內(nèi)定義一個(gè)這個(gè)函數(shù)進(jìn)行統(tǒng)一的處理。

echo $a; // Notice: Undefined variable: a ...
//  E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING 不能處理
set_error_handler(function($errno, $errstr, $errfile, $errline){
    echo "Has Error:", $errno, ',', $errstr, ',', $errfile, ',', $errline, PHP_EOL; 
}, E_ALL | E_STRICT);

echo $a; // Has Error:8,Undefined variable: a ...

set_error_handler() 函數(shù)接收一個(gè)回調(diào)函數(shù)和一個(gè)錯(cuò)誤接收的類(lèi)型,它的函數(shù)簽名是:

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

$error_handler是一個(gè)回調(diào)(匿名)函數(shù),這個(gè)函數(shù)內(nèi)部可以獲取到錯(cuò)誤的等級(jí)、信息、文件、行數(shù)等

handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ) : bool
 

其中,$errcontext 已經(jīng)在 PHP7.2 之后取消了。

\$error_types,用于錯(cuò)誤接收的類(lèi)型,就像 error_reporting() 函數(shù)定義的錯(cuò)誤類(lèi)型一樣,它用于控制 $error_handler 回調(diào)函數(shù)所能接收的錯(cuò)誤的類(lèi)型。

需要注意的是,這個(gè)函數(shù)無(wú)法處理 E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING 這些類(lèi)型的錯(cuò)誤,也就是說(shuō),能夠中斷程序執(zhí)行的錯(cuò)誤它都無(wú)法捕獲處理。

另外,在函數(shù)調(diào)用之前的錯(cuò)誤是無(wú)法捕獲到的,只有在函數(shù)調(diào)用之后的錯(cuò)誤才能通過(guò)這個(gè)函數(shù)進(jìn)行捕獲處理。 

restore_error_handler()

這個(gè)函數(shù)是用于還原之前的錯(cuò)誤處理函數(shù)。比如我們?cè)谏厦娲a下添加這個(gè)函數(shù),然后再次觸發(fā)錯(cuò)誤,錯(cuò)誤將會(huì)使用回 PHP 的標(biāo)準(zhǔn)處理程序。

restore_error_handler();

echo $a; // Notice: Undefined variable: a ...
   

set_exception_handler()

學(xué)習(xí)了上面錯(cuò)誤處理的函數(shù)后,從名稱(chēng)就可以看出,這個(gè)函數(shù)是用來(lái)處理異常的,它可以在全局范圍內(nèi)捕獲異常。

set_exception_handler(function($ex){
    echo "Has Exception: " , $ex->getMessage(), PHP_EOL;
});

throw new Exception('Init Error');
 

它的函數(shù)簽名是:

set_exception_handler ( callable $exception_handler ) : callable 

只接收一個(gè)回調(diào)函數(shù),回調(diào)函數(shù)中只有一個(gè)參數(shù),是一個(gè) Exception 類(lèi)型的參數(shù)內(nèi)容,就和 try...catch 中的 catch 塊的參數(shù)一樣。在 PHP7 以后接收到的是一個(gè) Throwable 類(lèi)型的參數(shù)。也就是說(shuō),它可以捕獲到所有的錯(cuò)誤和異常。

不過(guò)需要注意的是,在 PHP 中,所有的異常如果不進(jìn)行處理,都會(huì)以中止腳本的錯(cuò)誤形式返回報(bào)錯(cuò)信息。所以,在 set_exception_handler() 內(nèi)處理完之后,腳本會(huì)中止運(yùn)行。即使后面還有代碼。所以,這個(gè)函數(shù)一般會(huì)用于全局捕獲一些異常、錯(cuò)誤后進(jìn)行日志記錄,它不具有 try...catch 的能力,讓異常處理完成后還能繼續(xù)進(jìn)行其他操作。 

restore_exception_handler()

同樣的,異常捕獲也是可以進(jìn)行回退的。

set_exception_handler(function($ex){
    echo "Has Exception First: " , $ex->getMessage(), PHP_EOL;
});
set_exception_handler(function($ex){
    echo "Has Exception Second: " , $ex->getMessage(), PHP_EOL;
});

restore_exception_handler();

throw new Exception('Init Error Next'); // Has Exception First: Init Error Next
 

我們定義了兩個(gè) set_exception_handler() 函數(shù),當(dāng)使用 restore_exception_handler() 后,拋出的異常將會(huì)進(jìn)入到第一個(gè) set_exception_handler() 函數(shù)中進(jìn)行處理。同理,restore_error_handler() 函數(shù)如果定義了多個(gè)錯(cuò)誤處理,使用 restore_error_handler() 后也會(huì)一級(jí)一級(jí)回退,直到最終使用 PHP 的錯(cuò)誤處理流程進(jìn)行處理。 

trigger_error()

最后,我們來(lái)看看如何手動(dòng)拋出一個(gè)錯(cuò)誤。就像上面例子中的 throw new Exception() 一樣,PHP 也提供了一個(gè)用戶(hù)自定義手動(dòng)拋出錯(cuò)誤的函數(shù)。

trigger_error("I'm Error One!"); // Notice: I'm Error One!  

它的函數(shù)簽名是:

trigger_error ( string $error_msg [, int $error_type = E_USER_NOTICE ] ) : bool

$error_msg,也就是這個(gè)錯(cuò)誤的具體信息,長(zhǎng)度限制為 1024 個(gè)字節(jié),如果超過(guò)了這個(gè)長(zhǎng)度就會(huì)被截?cái)唷A硗?,如果這個(gè)信息中包含 HTML 實(shí)體標(biāo)簽的話(huà),也不會(huì)直接轉(zhuǎn)義,在網(wǎng)頁(yè)顯示時(shí)需要使用 htmlentities() 來(lái)進(jìn)行處理。

$error_type參數(shù)則是指定報(bào)錯(cuò)的級(jí)別,默認(rèn)是 E_USER_NOTICE ,而且它只支持 E_USER... 相關(guān)的錯(cuò)誤信息。也就是說(shuō),它的參數(shù)只能填三個(gè) E_USER_NOTICE 、 E_USER_WARNING 、 E_USER_ERROR 。

當(dāng)然,我們手動(dòng)拋出的錯(cuò)誤信息也是可以通過(guò) set_error_handler() 進(jìn)行捕獲的。

set_error_handler(function($errno, $errstr, $errfile, $errline){
    echo "Has Error:", $errno, ',', $errstr, ',', $errfile, ',', $errline, PHP_EOL; 
}, E_ALL | E_STRICT);
trigger_error("I'm Error One!"); // Has Error:1024,I'm Error One!,...
trigger_error("I'm Error Two!", E_USER_WARNING); // Has 512,I'm Error One!,...
trigger_error("I'm Error Three!", E_USER_ERROR); // Has 256,I'm Error One!,...

trigger_error("I'm Error Four!", E_WARNING); // Has Error:2,Invalid error type specified,...

最后一個(gè) trigger_error() 我們使用了 E_WARNING 類(lèi)型,可以看出直接返回的內(nèi)容是 指定的錯(cuò)誤類(lèi)型無(wú)效 ,而不是我們定義的內(nèi)容。也就是說(shuō),這里是這個(gè)函數(shù)的參數(shù)類(lèi)型錯(cuò)誤的報(bào)錯(cuò),不是我們手動(dòng)想拋出的錯(cuò)誤了。

關(guān)于“php的錯(cuò)誤處理函數(shù)怎么用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“php的錯(cuò)誤處理函數(shù)怎么用”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI