=====錯誤類型====
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比個舊網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式個舊網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋個舊地區(qū)。費用合理售后完善,十載實體公司更值得信賴。
PHP 主要有兩種錯誤:觸發(fā)錯誤和異常。
其中觸發(fā)錯誤大概可以分為:編譯錯誤、引擎錯誤和運行時錯誤,其中前兩個是無法捕獲的;
異常都是可以捕獲的,當(dāng)沒有嘗試捕獲時則會中斷代碼。
觸發(fā)錯誤可以通過 error_get_last() 來進行獲得,異??梢允褂脴?biāo)準(zhǔn)的 try...catch 語句來捕獲。
=====處理方式=====
【錯誤報告】
error_reporting() 函數(shù)是 PHP 提供的一個控制錯誤等級的函數(shù),如果設(shè)置了對應(yīng)的錯誤等級,則只會在對應(yīng)錯誤等級觸發(fā)時才會在頁面(或輸出,對于命令行來說)輸出響應(yīng)的錯誤信息。
error_reporting(int level) 支持等級 level 參數(shù)使用二進制的數(shù)字來配置錯誤等級,錯誤等級一般用常量來代替對應(yīng)的二進制標(biāo)識。例如:E_ALL、E_NOTICE、 E_USER_NOTICE 等等;如果不傳遞參數(shù),則會返回當(dāng)前的錯誤等級(一般用來保存當(dāng)前的錯誤等級以供后續(xù)恢復(fù))。
其中 E_PARSE、E_COMPILE_* 和 E_CORE_* 是非運行時錯誤,無法被捕獲的
【php.ini】
配置文件是 PHP 初始化的默認(rèn)配置,通過修改某些參數(shù)可以控制對應(yīng)的初始化參數(shù)。如果要控制錯誤,可以通過以下幾個方式來配置:
display_errors - 是否顯示錯誤,一般在生產(chǎn)環(huán)境建議關(guān)閉該參數(shù)并和下列的參數(shù)一起試用 log_errors - 記錄錯誤開關(guān),如果打開會記錄到對應(yīng)位置 error_log - 記錄錯誤日志的位置,不指定為系統(tǒng)默認(rèn) error_reporting - 同上面的函數(shù)
【錯誤抑制】
PHP 提供了一種特殊的操作,通過在語句前面加上抑制錯誤操作符@來抑制該語句出現(xiàn)錯誤。這種情況通常用于你不知道會發(fā)生什么情況下使用,比如打開了不確定的文件或者網(wǎng)絡(luò) URL,但一般不推薦使用
抑制錯誤本身內(nèi)部做了一系列的處理才達到該效果,并且對于錯誤本身完全是未知的,一般情況下,不建議這么使用
【捕獲異?!?/p>
幾乎在所有語言中,都會有對于異常的處理。如果程序拋出一個異常,那么可以通過 try…catch 語句來捕獲該異常,如果明確知道錯誤的類型,也可以只捕獲該類型的錯誤。try…catch 是一種最標(biāo)準(zhǔn)的錯誤處理方式。
try {
// 代碼部分
} catch (Exception $e) {
// 根據(jù)異常對象對 $e 進行處理
}
【設(shè)置錯誤處理器】
PHP 提供了 set_error_handler() 函數(shù)來讓開發(fā)者傳入一個函數(shù)名(或匿名函數(shù),對于 5.2 以上的 PHP)就可以讓所有的錯誤進入該函數(shù),然后開發(fā)者可以在函數(shù)內(nèi)進行控制,舉例說明
set_error_handler(function($code, $msg){
log_error("$msg occur with code $code");
});
對應(yīng)地,PHP 也提供了 restore_error_handler() 來恢復(fù)為標(biāo)準(zhǔn)的 PHP 錯誤控制。
【設(shè)置異常處理器】
如果每個異常都去捕獲,顯然是很復(fù)雜的事情,需要編寫很多代碼,而且維護起來會比較復(fù)雜,對于一個快速編程的語言來說,PHP 自然不會允許發(fā)生這種事情。使用 set_exception_handler() 就可以像上面錯誤處理控制器一樣接收所有未捕獲的異常,然后做一些該做的事情,甚至還可以再把錯誤拋出來。例如:
set_exception_handler(function($exception){
log_error("Exception occur: $exception");
});
【崩潰捕獲】
該類處理并非 PHP 標(biāo)準(zhǔn)的處理方式,但對于某種使程序崩潰的無法捕獲的錯誤確實很有用,它是指注冊一個 shutdown 函數(shù),在函數(shù)內(nèi)通過調(diào)用 error_get_last() 來獲取最后的錯誤,并且根據(jù)錯誤等級來做相應(yīng)的處理。
register_shutdown_function(function(){
$error = error_get_last();
if ($error && $error['code']()() & error_reporting()) {
// 崩潰錯誤,記錄日志
}
});