博客專欄

EEPW首頁 > 博客 > php錯誤處理異常處理控制函數(shù)詳解

php錯誤處理異常處理控制函數(shù)詳解

發(fā)布人:only1 時間:2020-09-24 來源:工程師 發(fā)布文章

在現(xiàn)如今,隨著互聯(lián)網(wǎng)技術(shù)發(fā)展越來越成熟,比如PHP7.0對速度進行大幅度提高之后,7.1版本繼續(xù)優(yōu)化了在網(wǎng)頁服務(wù)器方面的性能,而今天扣丁學(xué)堂PHP培訓(xùn)關(guān)于php錯誤處理異常處理控制函數(shù)做了一些介紹,首先在實際開發(fā)中,錯誤及異常捕捉僅僅靠try{}catch()是遠遠不夠的,下面我們一起來看一下吧。  

try{  

//在這里主動拋出異常,(在這里說一下,php正常開發(fā)中最好不要主動拋出異常)thrownewException('NichtaufgefangeneException');  

}  

catch(Exception$e)  

{  

var_dump($e);  

}  

所以引用以下幾中函數(shù)。  

error_reporting(E_ALL);設(shè)置異常錯誤顯示等級0為禁止錯誤  

//禁用錯誤報告  

error_reporting(0);  

//報告運行時錯誤  

error_reporting(E_ERROR|E_WARNING|E_PARSE);  

//報告所有錯誤  

error_reporting(E_ALL);  

//除去提醒處理  

error_reporting(E_ALL~E_NOTICE);  

set_exception_handler當出現(xiàn)異常trycatch未捕捉到的時候就會觸發(fā)一個參數(shù)是一個執(zhí)行的自定義錯誤處理函數(shù)、可以是數(shù)組第一個值是那個類,第二個值是類里面的什么方法  

register_shutdown_function當php腳本執(zhí)行即將關(guān)閉時執(zhí)行的函數(shù)、腳本執(zhí)行完或者出錯如果再次之前設(shè)置過這個函數(shù)就會觸發(fā)參數(shù)一個函數(shù)名用來處理、可以是系統(tǒng)內(nèi)置也可以是自定義的  

trigger_error用戶自定一個一個異常錯誤第一個參數(shù)錯誤內(nèi)容第二個可選參數(shù)錯誤級別  

error_get_last()獲取最后發(fā)生的異常錯誤  

a)set_error_handler設(shè)置異常處理函數(shù)一個參數(shù)是一個執(zhí)行的自定義錯誤處理函數(shù)、可以是數(shù)組第一個值是那個類,第二個值是類里面的什么方法  

一般用于捕捉E_NOTICE、E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE  

不能捕捉:  

E_ERROR,E_PARSE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERRORandE_COMPILE_WARNING。  

一般與trigger_error("...",E_USER_ERROR),配合使用。  

預(yù)覽源代碼打印  

//wewilldoourownerrorhandling  

03error_reporting(0);  

04functionuserErrorHandler($errno,$errmsg,$filename,$linenum,$vars)  

05{  

06//timestampfortheerrorentry  

07$dt=date("Y-m-dH:i:s(T)");  

08//defineanassocarrayoferrorstring  

09//inrealitytheonlyentriesweshould  

10//considerareE_WARNING,E_NOTICE,E_USER_ERROR,  

11//E_USER_WARNINGandE_USER_NOTICE  

12$errortype=array(  

13E_ERROR=>'Error',  

14E_WARNING=>'Warning',  

15E_PARSE=>'ParsingError',  

16E_NOTICE=>'Notice',  

17E_CORE_ERROR=>'CoreError',  

18E_CORE_WARNING=>'CoreWarning',  

19E_COMPILE_ERROR=>'CompileError',  

20E_COMPILE_WARNING=>'CompileWarning',  

21E_USER_ERROR=>'UserError',  

22E_USER_WARNING=>'UserWarning',  

23E_USER_NOTICE=>'UserNotice',  

24E_STRICT=>'RuntimeNotice',  

25E_RECOVERABLE_ERROR=>'CatchableFatalError'  

26);  

27//setoferrorsforwhichavartracewillbesaved  

28$user_errors=array(E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE);  

29$err="\n";  

30$err.="\t".$dt."\n";  

31$err.="\t".$errno."\n";  

32$err.="\t".$errortype[$errno]."\n";  

33$err.="\t".$errmsg."\n";  

34$err.="\t".$filename."\n";  

35$err.="\t".$linenum."\n";  

36if(in_array($errno,$user_errors)){  

37$err.="\t".wddx_serialize_value($vars,"Variables")."\n";  

38}  

39$err.="\n\n";  

40echo$err;  

41}  

42functiondistance($vect1,$vect2){  

43if(!is_array($vect1)||!is_array($vect2)){  

44trigger_error("Incorrectparameters,arraysexpected",E_USER_ERROR);  

45returnNULL;  

46}  

47if(count($vect1)!=count($vect2)){  

48trigger_error("Vectorsneedtobeofthesamesize",E_USER_ERROR);  

49returnNULL;  

50}  

51for($i=0;$i  

52$c1=$vect1[$i];$c2=$vect2[$i];  

53$d=0.0;  

54if(!is_numeric($c1)){  

55trigger_error("Coordinate$iinvector1isnotanumber,usingzero",E_USER_WARNING);  

56$c1=0.0;  

57}  

58if(!is_numeric($c2)){  

59trigger_error("Coordinate$iinvector2isnotanumber,usingzero",E_USER_WARNING);  

60$c2=0.0;  

61}  

62$d+=$c2*$c2-$c1*$c1;  

63}  

64returnsqrt($d);  

65}  

66  

67$old_error_handle=set_error_handler("userErrorHandler");  

68$t=I_AM_NOT_DEFINED;//generatesawarning  

69  

70//definesome"vectors"  

71$a=array(2,3,"foo");  

72$b=array(5.5,4.3,-1.6);  

73$c=array(1,-3);  

74  

75//generateausererror  

76$t1=distance($c,$b);  

77  

78//generateanotherusererror  

79$t2=distance($b,"iamnotanarray")."\n";  

80  

81//generateawarning  

82$t3=distance($a,$b)."\n";  

83?>  

b)set_exception_handler  

設(shè)置默認的異常處理程序,用于沒有用try/catch塊來捕獲的異常。在exception_handler調(diào)用后異常會中止。  

與thrownewException('UncaughtExceptionoccurred'),連用。  

預(yù)覽源代碼打印01  

02//wewilldoourownerrorhandling  

03error_reporting(0);  

04functionexceptHandle($errno,$errmsg,$filename,$linenum,$vars)  

05{  

06//timestampfortheerrorentry  

07$dt=date("Y-m-dH:i:s(T)");  

08//defineanassocarrayoferrorstring  

09//inrealitytheonlyentriesweshould  

10//considerareE_WARNING,E_NOTICE,E_USER_ERROR,  

11//E_USER_WARNINGandE_USER_NOTICE  

12$errortype=array(  

13E_ERROR=>'Error',  

14E_WARNING=>'Warning',  

15E_PARSE=>'ParsingError',  

16E_NOTICE=>'Notice',  

17E_CORE_ERROR=>'CoreError',  

18E_CORE_WARNING=>'CoreWarning',  

19E_COMPILE_ERROR=>'CompileError',  

20E_COMPILE_WARNING=>'CompileWarning',  

21E_USER_ERROR=>'UserError',  

22E_USER_WARNING=>'UserWarning',  

23E_USER_NOTICE=>'UserNotice',  

24E_STRICT=>'RuntimeNotice',  

25E_RECOVERABLE_ERROR=>'CatchableFatalError'  

26);  

27//setoferrorsforwhichavartracewillbesaved  

28$err="\n";  

29$err.="\t".$dt."\n";  

30$err.="\t".$errno."\n";  

31$err.="\t".$errortype[$errno]."\n";  

32$err.="\t".$errmsg."\n";  

33$err.="\t".$filename."\n";  

34$err.="\t".$linenum."\n";  

35if(1){  

36$err.="\t".wddx_serialize_value($vars,"Variables")."\n";  

37}  

38$err.="\n\n";  

39echo$err;  

40}  

41$old_except_handle=set_exception_handler("exceptHandle");  

42//$t=I_AM_NOT_DEFINED;//generatesawarning  

43$a;  

44thrownewException('UncaughtExceptionoccurred');  

45?>  

c)register_shutdown_function  

執(zhí)行機制是:php把要調(diào)用的函數(shù)調(diào)入內(nèi)存。當頁面所有PHP語句都執(zhí)行完成時,再調(diào)用此函數(shù)。  

一般與trigger_error("...",E_USER_ERROR),配合使用。  

預(yù)覽源代碼打印01  

02error_reporting(0);  

03date_default_timezone_set('Asia/Shanghai');  

04register_shutdown_function('my_exception_handler');  

05  

06$t=I_AM_NOT_DEFINED;//generatesawarning  

07trigger_error("Vectorsneedtobeofthesamesize",E_USER_ERROR);  

08  

09functionmy_exception_handler()  

10{  

11if($e=error_get_last()){  

12//$e['type']對應(yīng)php_error常量  

13$message='';  

14$message.="出錯信息:\t".$e['message']."\n\n";  

15$message.="出錯文件:\t".$e['file']."\n\n";  

16$message.="出錯行數(shù):\t".$e['line']."\n\n";  

17$message.="\t\t請工程師檢查出現(xiàn)程序".$e['file']."出現(xiàn)錯誤的原因\n";  

18$message.="\t\t希望能您早點解決故障出現(xiàn)的原因";  

19echo$message;  

20//sendemailto  

21}  

22}  

23?>  

c)restore_error_handler()函數(shù)  

定義和用法restore_error_handler()函數(shù)恢復(fù)之前的錯誤處理程序,該程序是由set_error_handler()函數(shù)改變的。  

該函數(shù)永遠返回true。  

是set_error_handler()的反函數(shù)。  

每次調(diào)用該函數(shù)下次出現(xiàn)異常就會執(zhí)行前一個定義錯誤的函數(shù),如果一直恢復(fù)之前,直到恢復(fù)到之前沒有處理函數(shù)就會報錯;  

預(yù)覽源代碼打印01mysql_connect("inexistent");//Generateanerror.Theactualerrorhandlerissetbydefault  

02  

03functionfoo1(){echo"Errorfoo1";}  

04functionfoo2(){echo"Errorfoo2";}  

05functionfoo3(){echo"Errorfoo3";}  

06  

07set_error_handler("foo1");//currenterrorhandler:foo1  

08set_error_handler("foo2");//currenterrorhandler:foo2  

09set_error_handler("foo3");//currenterrorhandler:foo3  

10  

11mysql_connect("inexistent");  

12restore_error_handler();//now,currenterrorhandler:foo2  

13mysql_connect("inexistent");  

14restore_error_handler();//now,currenterrorhandler:foo1  

15mysql_connect("inexistent");  

16restore_error_handler();//nowcurrenterrorhandler:defaulthandler  

17mysql_connect("inexistent");  

18restore_error_handler();//nowcurrenterrorhandler:defaulthandler(Thestackcan't  

以上就是關(guān)于php錯誤處理異常處理控制函數(shù)的詳細介紹,最后想要了解更多關(guān)于PHP發(fā)展前景趨勢,請關(guān)注扣丁學(xué)堂官網(wǎng)、微信等平臺,扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育平臺為您提供權(quán)威的PHP視頻教程系統(tǒng),通過千鋒扣丁學(xué)堂金牌講師在線錄制的第一套自適應(yīng)PHP在線視頻課程系統(tǒng),讓你快速掌握PHP從入門到精通開發(fā)實戰(zhàn)技能??鄱W(xué)堂PHP技術(shù)交流群:374332265。

*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。

比較器相關(guān)文章:比較器工作原理


上拉電阻相關(guān)文章:上拉電阻原理


關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉