這篇文章給大家分享的是有關php7中錯誤與異常要如何處理的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
在三都等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站制作 網(wǎng)站設計制作按需策劃設計,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,成都品牌網(wǎng)站建設,營銷型網(wǎng)站建設,成都外貿網(wǎng)站建設,三都網(wǎng)站建設費用合理。錯誤
錯誤是寫程序中不可避免的,如何去發(fā)現(xiàn)定位錯誤及改正更是一門學問。今天和大家聊聊php7之后的錯誤與異常。
錯誤的分類
一般錯誤分為語法錯誤、運行時錯誤、邏輯錯誤。語法以及運行時錯誤很容易去排查,但邏輯錯誤就不是那么簡單的了。鄙人在判斷的時候也有多次將比較運算==寫成了賦值運算=,像我這種就很難去發(fā)現(xiàn)。一般隨著經驗的豐富(踩坑踩多了),會越來越容易來找到邏輯錯誤。
控制錯誤的輸出
一般建議開發(fā)階段開啟錯誤輸出方便及時發(fā)現(xiàn)錯誤,上線階段為了安全性及美觀建議關閉錯誤輸出。
php提供了一個參數(shù)display_errors用于控制錯誤向瀏覽器、cli的輸出。有兩種方式可以來修改它,通過修改php.ini文件或使用ini_set函數(shù)來設置。下面展示使用ini_set來設置屏蔽錯誤輸出的代碼。
<?php ini_set('display_errors', 0); echo $a; echo 0; date(); echo 1;
該程序會正常輸出01,但不會輸出錯誤信息。
錯誤報告級別
一般分為4大類
parse語法錯誤
error致命錯誤
warning警告級別錯誤
notice注意級別錯誤
在php.ini配置文件中,有選項error_reporting,該選項用來控制輸出何種級別的錯誤。常見的有E_ALL、E_WARNING、E_NOTICE。
可以通過函數(shù)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()函數(shù)可以生產一個用戶級別的錯誤。錯誤級別有E_USER_ERROR 、E_USER_WARNING、E_USER_NOTICE 等
<?php trigger_error('這是notice級別錯誤', E_USER_NOTICE); trigger_error('warning錯誤', E_USER_WARNING); trigger_error('deprecated', E_USER_DEPRECATED); trigger_error('error錯誤', E_USER_ERROR);
自定義錯誤處理
set_error_handler — 設置用戶自定義的錯誤處理函數(shù),該函數(shù)原型如下:
set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed
該函數(shù)首個參數(shù)是一個回調函數(shù),原型如下:
handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ) : bool
error 錯誤級別
errstr 錯誤信息
errfile 發(fā)送錯誤的文件
errline 錯誤出現(xiàn)的行號
以下級別的錯誤不能由用戶定義的函數(shù)來處理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在調用 set_error_handler() 函數(shù)所在文件中產生的大多數(shù) E_STRICT。
<?php define('DEBUG', false); set_error_handler('error_handler'); if (DEBUG) { ini_set('display_errors', 'On'); } else { ini_set('display_errors', 'Off'); } function error_handler($errLevel, $errInfo, $errFile, $errLine) { echo "ErrorLevel:$errLevel: $errInfo In $errFile ON $errLine" . PHP_EOL; } echo $a;
異常
異常和錯誤時有區(qū)別的,錯誤一般是指我們能控制的問題,比如變量名寫錯了,或者判斷條件寫的不錯,導致死循環(huán)。而異常通常指那些難以控制的、意料外的錯誤,比如mysql連接不上,文件句柄打開失敗等情況。
php的異常也是經典的try catch finally,但和一般的異常處理不一樣的是,絕大部分的異常需要自行拋出。拋出異常使用throw關鍵字完成。php也支持捕獲多個異常。
<?php class MyError extends Exception { public function printErr () { echo '出錯啦'.PHP_EOL; } } class YourError extends Exception { public function printErr () { echo 'errors'.PHP_EOL; } } try { if (mt_rand(0,1)) { throw new MyError('錯誤'); } else { throw new YourError('錯誤'); } } catch (MyError $e) { $e->printErr(); } catch (YourError $e) { $e->printErr(); } finally { echo '不管有沒有異常,我都會被執(zhí)行'.PHP_EOL; }
php的異常如果沒有捕獲,則會報Fatal Error錯誤,程序不會繼續(xù)向下執(zhí)行。
PHP 7 錯誤處理
PHP 7 改變了大多數(shù)錯誤的報告方式。不同于傳統(tǒng)(PHP 5)的錯誤報告機制,現(xiàn)在大多數(shù)錯誤被作為 Error 異常拋出。 Error 和 Exception 都實現(xiàn)了 Throwable 接口
異常處理
設置默認的異常處理程序,有try/catch捕獲的話這個異常函數(shù)就不會執(zhí)行,反之就會執(zhí)行異常處理函數(shù),而且執(zhí)行的話,腳本將不會繼續(xù)執(zhí)行。
php使用set_exception_handler來設置用戶自定義的異常處理函數(shù) ,函數(shù)原型如下:
set_exception_handler ( callable $exception_handler ) : callable
回調函數(shù)的原型如下:
handler ( Throwable $ex ) : void
下面,我們來寫一個異常處理函數(shù)
<?php class MyError extends Exception { public function printErr () { echo '出錯啦'.PHP_EOL; } } class YourError extends Exception { public function printErr () { echo 'errors'.PHP_EOL; } } try { if (mt_rand(0,1)) { throw new MyError('錯誤'); } else { throw new YourError('錯誤'); } } catch (MyError $e) { $e->printErr(); } catch (YourError $e) { $e->printErr(); } finally { echo '不管有沒有異常,我都會被執(zhí)行'.PHP_EOL; }
統(tǒng)一處理錯誤與異常
學完了錯誤與異常,知道如何去使用自定義錯誤處理和異常處理,現(xiàn)在我們就可以統(tǒng)一處理錯誤與異常了。
<?php class Errors { // 處理非致命錯誤 static function errorHandle($errLevel, $errInfo, $errFile, $errLine) { echo '錯誤:'.PHP_EOL; print_r(['file' => $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中錯誤與異常要如何處理就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
本文標題:php7中錯誤與異常要如何處理-創(chuàng)新互聯(lián)
文章起源:http://jinyejixie.com/article24/dhodje.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供自適應網(wǎng)站、網(wǎng)站營銷、網(wǎng)站收錄、搜索引擎優(yōu)化、網(wǎng)站制作、建站公司
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)