PHP錯(cuò)誤級(jí)別
Parse error
> Fatal Error
> Waning
> Notice
> Deprecated
-
Deprecated 最低級(jí)別的錯(cuò)誤(不推薦,不建議)
使用一些過期函數(shù)的時(shí)候會(huì)出現(xiàn),程序繼續(xù)執(zhí)行
-
Notice 通知級(jí)別的錯(cuò)誤
使用一些未定義變量、常量或者數(shù)組key沒有加引號(hào)的時(shí)候會(huì)出現(xiàn),程序繼續(xù)執(zhí)行
-
Waning 警告級(jí)別的錯(cuò)誤
程序出問題了,需要修改代碼?。?!程序繼續(xù)執(zhí)行
-
Fatal Error 錯(cuò)誤級(jí)別的錯(cuò)誤
程序直接報(bào)錯(cuò),需要修改代碼?。。≈袛喑绦驁?zhí)行,可使用register_shutdown_function()函數(shù)在程序終止前觸發(fā)一個(gè)函數(shù)
-
Parse error 語法解析錯(cuò)誤
語法檢查階段報(bào)錯(cuò),需要修改代碼!??!中斷程序執(zhí)行,除了修改ini文件,將錯(cuò)誤信息寫到日志中,什么也做不了
-
E_USER_相關(guān)的錯(cuò)誤
用戶定義的錯(cuò)誤,用戶手動(dòng)拋出錯(cuò)誤,進(jìn)行自定義錯(cuò)誤處理
PHP錯(cuò)誤相關(guān)函數(shù)
-
ini_set('display_errors', 0);
//關(guān)閉錯(cuò)誤輸出(開發(fā)環(huán)境開啟,生產(chǎn)環(huán)境關(guān)閉) -
error_reporting(E_ALL&~E_NOTICE);
//設(shè)置錯(cuò)誤報(bào)告級(jí)別 -
ini_set('error_reporting',0);
//設(shè)置錯(cuò)誤報(bào)告級(jí)別
PHP錯(cuò)誤配置
-
除了在腳本里設(shè)置,還可以在php.ini配置文件里配置
-
error_reporting = E_ALL&~E_NOTICE;
//設(shè)置錯(cuò)誤報(bào)告級(jí)別 -
display_errors = 1;
//開發(fā)環(huán)境開啟,生產(chǎn)環(huán)境關(guān)閉
PHP異常
-
PHP的異常是后來新增特性,與JAVA/C#的異常不同,PHP異常需要手動(dòng)拋出
throw new Exception
,而不是系統(tǒng)自動(dòng)拋出 -
PHP錯(cuò)誤與異常的區(qū)別,他們是2個(gè)
不同的概念
,但有共同的地方:如果異常不捕獲處理,程序?qū)?huì)終止,并報(bào)出Fatal Error 錯(cuò)誤,看到這里大家就會(huì)覺得異常是不是錯(cuò)誤的一種,這是一種錯(cuò)覺,但這樣理解也可以。但異常捕獲后程序可以繼續(xù)執(zhí)行,而真正的Fatal Error錯(cuò)誤出現(xiàn)后程序就必須終止
-
異常可以使用
try{}catch(){}
來捕獲捕獲,捕獲之后后續(xù)代碼可以繼續(xù)執(zhí)行;而錯(cuò)誤是無法使用try{}catch(){}
捕獲的 -
如果拋出了異常,就必須捕獲它,否則程序終止執(zhí)行。
PHP異常與錯(cuò)誤的拋出
-
異常拋出:
throw new Exception('Some Error Message');
-
錯(cuò)誤拋出:
trigger_error()
-
trigger_error()
觸發(fā)的錯(cuò)誤不會(huì)被try-catch
異常捕獲語句捕獲
PHP錯(cuò)誤處理
-
set_error_handler()
只能處理Deprecated
、Notice
、Waning
這三種級(jí)別錯(cuò)誤,而且處理后,腳本將會(huì)繼續(xù)執(zhí)行發(fā)生錯(cuò)誤的后一行
-
register_shutdown_function()
這個(gè)方法是腳本結(jié)束前的最后一個(gè)回調(diào)函數(shù),所以無論是die()/錯(cuò)誤(異常)/還是腳本正常結(jié)束都會(huì)調(diào)用
PHP異常處理
-
set_exception_handler()
設(shè)置默認(rèn)的異常處理程序,有try/catch捕獲的話這個(gè)函數(shù)就不會(huì)執(zhí)行,反之就會(huì)執(zhí)行,而且執(zhí)行的話,腳本將不會(huì)繼續(xù)執(zhí)行發(fā)生異常的后一行代碼,程序馬上中止
-
set_exception_handler()
注意事項(xiàng)
set_exception_handler(“myException”) 不僅可以接受函數(shù)名,還可以接受 類的方法(公開的靜態(tài)方法 及 公開的非靜態(tài)方法 都可以),但需要以 數(shù)組形式 傳遞,數(shù)組的第一值為“類名”,第二個(gè)參數(shù)為“方法名”,如下代碼所示:
<?php class App{ function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } } set_exception_handler(array('App','myException')); throw new Exception('Uncaught Exception occurred'); ?>
PHP異常分類
-
由于用戶行為導(dǎo)致出現(xiàn)異常
1、沒有通過驗(yàn)證器
2、沒查詢到結(jié)果
3、需要向用戶返回具體信息
4、不需要記錄日志
5、可作為異?;蛘卟蛔鳛楫惓?,根據(jù)需求和個(gè)人情況而定
-
由于服務(wù)器自身導(dǎo)致出現(xiàn)異常
1、代碼出錯(cuò)
2、調(diào)用第三方接口錯(cuò)誤
3、不需要向用戶返回具體信息
4、需要記錄日志
在程序中PHP異常的自動(dòng)拋出
-
由于PHP異常是后面版本新增的特性,設(shè)計(jì)上與JAVA/C#的異常不一樣,JAVA的異常大部分是系統(tǒng)自動(dòng)拋出,而
PHP異常不是系統(tǒng)自動(dòng)拋出
,需要手動(dòng)拋出
,導(dǎo)致PHP異常在程序中的作用減半
(異常就是意料之外的事情,根本我們意料不到的,如果用手動(dòng)拋出,證明已經(jīng)預(yù)先預(yù)料到了,那異常的意義就變味了) -
在PHP中
異常是手動(dòng)拋出的
,而錯(cuò)誤是系統(tǒng)自動(dòng)拋出的
(也可手動(dòng)拋) -
我們需要把
異常做成系統(tǒng)自動(dòng)拋出接
(例如JAVA)就必須借助錯(cuò)誤
(這三種錯(cuò)誤Deprecated
、Notice
、Waning
,其他的錯(cuò)誤不行,因?yàn)闀?huì)終止程序運(yùn)行)
<?php set_error_handler('error_handler'); function error_handler($errno, $errstr, $errfile, $errline) { throw new Exception($errstr); } try { $num = 100 / 0; } catch(Exception $e) { echo $e -> getMessage() . '<br/>'; } echo "end"; ?>
執(zhí)行結(jié)果:
Division by zero end
PHP7 異常處理的大變化
-
一段TP5源代碼引出
PHP7異常
的變化明明set_exception_handler()函數(shù)只可以捕獲
Exception類或派生類的對(duì)象
,為何還需要捕獲的對(duì)象做判斷呢?結(jié)果引出了PHP7
的變化,請(qǐng)看下面分析 -
前面已經(jīng)講過異常是需要
手動(dòng)拋出
,及時(shí)上面所說的方法最多也是把Deprecated
、Notice
、Waning
這3類錯(cuò)誤封裝成系統(tǒng)自動(dòng)拋出的異常,但致命錯(cuò)誤仍然還是無法封裝成系統(tǒng)自動(dòng)拋出的異常,因?yàn)橹旅e(cuò)誤(Fatel Error)仍然無法捕獲 -
在PHP7之前,
Deprecated
、Notice
、Waning
這類錯(cuò)誤是可以捕獲的(使用set_error_handler()函數(shù)),而Fatel Error
無法捕獲的 -
在PHP7之后,出現(xiàn)了一個(gè)異常與錯(cuò)誤通用的接口Throwable,Exception類與Error類都實(shí)現(xiàn)了該接口,導(dǎo)致
Error類或Error類的派生類的錯(cuò)誤對(duì)象
(大部分Fatel Error,而之前三類錯(cuò)誤不變)也可以像Exception一樣被捕獲(2種捕獲方法:1、try/catch 2、set_exception_handler()) -
示例代碼
try{ go();//該函數(shù)未定義 }catch(Exception $e){ //捕獲異常 }catch(Error $er){ //捕獲錯(cuò)誤 }
相關(guān)教程推薦:《PHP教程》