日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
php7的錯誤與異常處理

錯誤

十年的余慶網站建設經驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。全網營銷推廣的優(yōu)勢是能夠根據用戶設備顯示端的尺寸不同,自動調整余慶建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“余慶網站設計”,“余慶網站推廣”以來,每個客戶項目都認真落實執(zhí)行。

錯誤是寫程序中不可避免的,如何去發(fā)現(xiàn)定位錯誤及改正更是一門學問。今天和大家聊聊php7之后的錯誤與異常。

錯誤的分類

一般錯誤分為語法錯誤、運行時錯誤、邏輯錯誤。語法以及運行時錯誤很容易去排查,但邏輯錯誤就不是那么簡單的了。鄙人在判斷的時候也有多次將比較運算==寫成了賦值運算=,像我這種就很難去發(fā)現(xiàn)。一般隨著經驗的豐富(踩坑踩多了),會越來越容易來找到邏輯錯誤。

控制錯誤的輸出

一般建議開發(fā)階段開啟錯誤輸出方便及時發(fā)現(xiàn)錯誤,上線階段為了安全性及美觀建議關閉錯誤輸出。

php提供了一個參數display_errors用于控制錯誤向瀏覽器、cli的輸出。有兩種方式可以來修改它,通過修改php.ini文件或使用ini_set函數來設置。下面展示使用ini_set來設置屏蔽錯誤輸出的代碼。

該程序會正常輸出01,但不會輸出錯誤信息。

錯誤報告級別

一般分為4大類

parse語法錯誤

error致命錯誤

warning警告級別錯誤

notice注意級別錯誤

在php.ini配置文件中,有選項error_reporting,該選項用來控制輸出何種級別的錯誤。常見的有E_ALL、E_WARNING、E_NOTICE。

可以通過函數error_reporting()來動態(tài)控制錯誤級別的輸出。

# 輸出所有級別錯誤
error_reporting(E_ALL);
# 輸出所有級別除了E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
# 輸出所有級別除了E_NOTICE和E_WARNING
error_reporting(E_ALL & ~(E_NOTICE | E_WARNING));

display_errors與error_reporting的區(qū)別

display_errors是用來控制錯誤是否輸出,而error_reporting是用來控制輸出何種級別的錯誤。通常他們會搭配使用

ini_set('display_errors', 0); // 關閉錯誤輸出
error_reporting(E_ALL);  // 輸出所有級別的錯誤信息

上面的配置一般是上線階段,屏蔽所有的錯誤輸出,但是記錄錯誤到php的錯誤日志里。錯誤日志的路徑是由選項error_log 決定的。

如果設置error_reporting為0值,則不輸出錯誤也不記錄錯誤日志。

錯誤對于程序的影響

當程序有語法錯誤時,程序是不會執(zhí)行的。當有error級別的錯誤時,程序就會停止向下執(zhí)行。notice、及warning級別錯誤時不會影響程序的向下執(zhí)行的。

error_reporting(E_ALL);  // 輸出所有級別的錯誤信息

echo $a;
echo 0;
date();
echo 1;
new a;
echo 2;

該程序會輸出0和1,但不會輸出2。

用戶自定義錯誤

trigger_error()函數可以生產一個用戶級別的錯誤。錯誤級別有E_USER_ERROR 、E_USER_WARNING、E_USER_NOTICE 等

自定義錯誤處理

set_error_handler — 設置用戶自定義的錯誤處理函數,該函數原型如下:

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

該函數首個參數是一個回調函數,原型如下:

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

error 錯誤級別

errstr 錯誤信息

errfile 發(fā)送錯誤的文件

errline 錯誤出現(xiàn)的行號

以下級別的錯誤不能由用戶定義的函數來處理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在調用 set_error_handler() 函數所在文件中產生的大多數 E_STRICT。

異常

異常和錯誤時有區(qū)別的,錯誤一般是指我們能控制的問題,比如變量名寫錯了,或者判斷條件寫的不錯,導致死循環(huán)。而異常通常指那些難以控制的、意料外的錯誤,比如mysql連接不上,文件句柄打開失敗等情況。

php的異常也是經典的try catch finally,但和一般的異常處理不一樣的是,絕大部分的異常需要自行拋出。拋出異常使用throw關鍵字完成。php也支持捕獲多個異常。

printErr();
} catch (YourError $e) {
    $e->printErr();
} finally {
    echo '不管有沒有異常,我都會被執(zhí)行'.PHP_EOL;
}

php的異常如果沒有捕獲,則會報Fatal Error錯誤,程序不會繼續(xù)向下執(zhí)行。

PHP 7 錯誤處理

PHP 7 改變了大多數錯誤的報告方式。不同于傳統(tǒng)(PHP 5)的錯誤報告機制,現(xiàn)在大多數錯誤被作為 Error 異常拋出。 Error 和 Exception 都實現(xiàn)了 Throwable 接口

異常處理

設置默認的異常處理程序,有try/catch捕獲的話這個異常函數就不會執(zhí)行,反之就會執(zhí)行異常處理函數,而且執(zhí)行的話,腳本將不會繼續(xù)執(zhí)行。

php使用set_exception_handler來設置用戶自定義的異常處理函數 ,函數原型如下:

set_exception_handler ( callable $exception_handler ) : callable

回調函數的原型如下:

handler ( Throwable $ex ) : void

下面,我們來寫一個異常處理函數

printErr();
} catch (YourError $e) {
    $e->printErr();
} finally {
    echo '不管有沒有異常,我都會被執(zhí)行'.PHP_EOL;
}

統(tǒng)一處理錯誤與異常

學完了錯誤與異常,知道如何去使用自定義錯誤處理和異常處理,現(xiàn)在我們就可以統(tǒng)一處理錯誤與異常了。

 $errFile, 'level' => $errLevel, 'line' => $errLine, 'info' => $errInfo]);
    }
 
    // 處理致命錯誤及異常
    static function exceptionHandle(Throwable $ex)
    {
        echo '異常:'.PHP_EOL;
        print_r(['file' => $ex->getFile(), 'level' => $ex->getCode(), 'line' => $ex->getLine(), 'info' => $ex->getMessage()]);
    }
}
 
set_error_handler(['Errors', 'errorHandle']);
set_exception_handler(['Errors', 'exceptionHandle']);

網站標題:php7的錯誤與異常處理
轉載注明:http://www.dlmjj.cn/article/cpeipe.html