您好,登錄后才能下訂單哦!
這篇文章主要介紹了php的錯誤處理函數怎么用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇php的錯誤處理函數怎么用文章都會有所收獲,下面我們一起來看看吧。
首先是大家可能會接觸過的一個函數,它可以用來捕獲一些錯誤的信息。如果我們需要統一處理一些錯誤,比如規定日志格式或者將錯誤信息發送到郵件中,一般會在入口文件的開頭在全局范圍內定義一個這個函數進行統一的處理。
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() 函數接收一個回調函數和一個錯誤接收的類型,它的函數簽名是:
set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed
$error_handler是一個回調(匿名)函數,這個函數內部可以獲取到錯誤的等級、信息、文件、行數等
handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ) : bool
其中,$errcontext 已經在 PHP7.2 之后取消了。
\$error_types,用于錯誤接收的類型,就像 error_reporting() 函數定義的錯誤類型一樣,它用于控制 $error_handler 回調函數所能接收的錯誤的類型。
需要注意的是,這個函數無法處理 E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING 這些類型的錯誤,也就是說,能夠中斷程序執行的錯誤它都無法捕獲處理。
另外,在函數調用之前的錯誤是無法捕獲到的,只有在函數調用之后的錯誤才能通過這個函數進行捕獲處理。
這個函數是用于還原之前的錯誤處理函數。比如我們在上面代碼下添加這個函數,然后再次觸發錯誤,錯誤將會使用回 PHP 的標準處理程序。
restore_error_handler();
echo $a; // Notice: Undefined variable: a ...
學習了上面錯誤處理的函數后,從名稱就可以看出,這個函數是用來處理異常的,它可以在全局范圍內捕獲異常。
set_exception_handler(function($ex){
echo "Has Exception: " , $ex->getMessage(), PHP_EOL;
});
throw new Exception('Init Error');
它的函數簽名是:
set_exception_handler ( callable $exception_handler ) : callable
只接收一個回調函數,回調函數中只有一個參數,是一個 Exception 類型的參數內容,就和 try...catch 中的 catch 塊的參數一樣。在 PHP7 以后接收到的是一個 Throwable 類型的參數。也就是說,它可以捕獲到所有的錯誤和異常。
不過需要注意的是,在 PHP 中,所有的異常如果不進行處理,都會以中止腳本的錯誤形式返回報錯信息。所以,在 set_exception_handler() 內處理完之后,腳本會中止運行。即使后面還有代碼。所以,這個函數一般會用于全局捕獲一些異常、錯誤后進行日志記錄,它不具有 try...catch 的能力,讓異常處理完成后還能繼續進行其他操作。
同樣的,異常捕獲也是可以進行回退的。
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
我們定義了兩個 set_exception_handler() 函數,當使用 restore_exception_handler() 后,拋出的異常將會進入到第一個 set_exception_handler() 函數中進行處理。同理,restore_error_handler() 函數如果定義了多個錯誤處理,使用 restore_error_handler() 后也會一級一級回退,直到最終使用 PHP 的錯誤處理流程進行處理。
最后,我們來看看如何手動拋出一個錯誤。就像上面例子中的 throw new Exception() 一樣,PHP 也提供了一個用戶自定義手動拋出錯誤的函數。
trigger_error("I'm Error One!"); // Notice: I'm Error One!
它的函數簽名是:
trigger_error ( string $error_msg [, int $error_type = E_USER_NOTICE ] ) : bool
$error_msg,也就是這個錯誤的具體信息,長度限制為 1024 個字節,如果超過了這個長度就會被截斷。另外,如果這個信息中包含 HTML 實體標簽的話,也不會直接轉義,在網頁顯示時需要使用 htmlentities() 來進行處理。
$error_type參數則是指定報錯的級別,默認是 E_USER_NOTICE ,而且它只支持 E_USER... 相關的錯誤信息。也就是說,它的參數只能填三個 E_USER_NOTICE 、 E_USER_WARNING 、 E_USER_ERROR 。
當然,我們手動拋出的錯誤信息也是可以通過 set_error_handler() 進行捕獲的。
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,...
最后一個 trigger_error() 我們使用了 E_WARNING 類型,可以看出直接返回的內容是 指定的錯誤類型無效 ,而不是我們定義的內容。也就是說,這里是這個函數的參數類型錯誤的報錯,不是我們手動想拋出的錯誤了。
關于“php的錯誤處理函數怎么用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“php的錯誤處理函數怎么用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。