在之前的文章中給大家?guī)?lái)了《一定搞得懂PHP中如何添加圖片水印》,其中通過(guò)過(guò)示例給大家詳細(xì)介紹了在PHP中應(yīng)該如何添加水印,本篇文章我們繼續(xù)來(lái)看一下PHP中錯(cuò)誤處理的相關(guān)知識(shí),希望能幫助到大家!
PHP中的錯(cuò)誤和異常處理在PHP中是非常常用的,在我們的日常開(kāi)發(fā)中,肯定會(huì)遇到比如忘記加分號(hào)了、函數(shù)名寫(xiě)錯(cuò)或者函數(shù)被重新定義了等等很多的錯(cuò)誤,如果說(shuō)在開(kāi)發(fā)過(guò)程中,能夠發(fā)現(xiàn)錯(cuò)誤顯示錯(cuò)誤,那肯定對(duì)我們的開(kāi)發(fā)是十分有利的。
因此,在開(kāi)發(fā)項(xiàng)目的時(shí)候合理使用一場(chǎng)處理,會(huì)有助于我們發(fā)現(xiàn)錯(cuò)誤改正錯(cuò)誤以加快開(kāi)發(fā)速度。那接下來(lái)我們就一起來(lái)看一看應(yīng)該怎樣去了解我們的錯(cuò)誤處理。大家也可以通過(guò)免費(fèi)的《php錯(cuò)誤處理》教學(xué)視頻來(lái)進(jìn)行學(xué)習(xí)。
PHP中的異常處理類(lèi)
在PHP中就提供了內(nèi)置的異常處理類(lèi),也就是Exception
,這個(gè)類(lèi)包含了一些處理異常的函數(shù),這些函數(shù)可以捕獲程序異常和錯(cuò)誤。
那下面列舉出該類(lèi)中較為常用的函數(shù):
-
getTraceAsString()
:返回已格式化成字符串的、由函數(shù) getTrace() 函數(shù)所產(chǎn)生的信息 -
__toString()
:產(chǎn)生異常的字符串信息,它可以重載。注意,該函數(shù)最前部是兩個(gè)下劃線(xiàn) -
getMessage()
:返回異常的消息內(nèi)容 -
getLine()
:返回發(fā)生錯(cuò)誤的代碼行號(hào) -
getCode()
:以數(shù)字形式返回異常代碼 -
getFile()
:返回發(fā)生異常的文件名 -
getTrace()
:返回 backtrace() 數(shù)組
捕獲程序中的異常
程序中的異常出現(xiàn)一般不會(huì)自己顯現(xiàn)出來(lái),這時(shí)候我們可以通過(guò)try catch
語(yǔ)句和 throw
關(guān)鍵字,來(lái)達(dá)到捕捉程序中異常的目的。
try catch語(yǔ)句和流程控制的語(yǔ)句類(lèi)似,throw關(guān)鍵字可以?huà)伋鲆粋€(gè)異常,我們可以通過(guò)類(lèi)似條件選擇的結(jié)構(gòu)來(lái)完成捕獲程序中的異常。try catch語(yǔ)句的語(yǔ)法格式如下:
try{ // 可能出現(xiàn)異常或錯(cuò)誤的代碼,比如文件操作、數(shù)據(jù)庫(kù)操作等 }catch(Exception $a){ // $a 為一個(gè)異常類(lèi)的對(duì)象 // 輸出錯(cuò)誤信息 }
在我們需要進(jìn)行捕捉程序異常時(shí),需要把需要捕捉的代碼放入try代碼塊里面,在上述語(yǔ)法中,每一個(gè)try應(yīng)該至少有一個(gè)與之對(duì)應(yīng)的catch。當(dāng)try代碼塊沒(méi)有catch匹配的異常時(shí),代碼就會(huì)跳轉(zhuǎn)到最后一個(gè)catch后面繼續(xù)進(jìn)行。
在其中產(chǎn)生的異常都可以被throw語(yǔ)句跑出來(lái)并且被catch捕獲,當(dāng)有一個(gè)異常出現(xiàn)的時(shí)候,在其后面的代碼就不會(huì)再繼續(xù)執(zhí)行了。
示例如下:
<?php try{ $err = '拋出異常信息,并跳出 try 語(yǔ)句塊'; if(is_dir('./demo')){ echo '這里是一些可能會(huì)發(fā)生異常的代碼'; }else{ throw new Exception($err, 20211020); // 拋出異常 } echo '上面拋出異常的話(huà),這行代碼將不會(huì)執(zhí)行,轉(zhuǎn)而執(zhí)行 catch 中的代碼。<br>'; }catch(Exception $e){ echo '捕獲異常:'.$e->getMessage().'<br>錯(cuò)誤代碼:'.$e->getCode().'<br>'; } echo '繼續(xù)執(zhí)行 try catch 語(yǔ)句之外的代碼'; ?>
輸出結(jié)果:
再上述示例中,通過(guò)try語(yǔ)句試圖判斷當(dāng)前目錄下有沒(méi)有名為demo的目錄,目錄不存在,所以執(zhí)行了throw關(guān)鍵字拋出異常。異常發(fā)現(xiàn)拋出后,try語(yǔ)句的剩下語(yǔ)句就不會(huì)在運(yùn)行了。
創(chuàng)建自己的異常類(lèi)
PHP中可以事先定義一些異常,因?yàn)镻HP中很少會(huì)主動(dòng)的拋出異常,當(dāng)事先定義好異常后,我們可以通過(guò)if-else來(lái)對(duì)可能出現(xiàn)的異常進(jìn)行判斷,手動(dòng)來(lái)拋出異常,再PHP中經(jīng)常能夠使用到我們自己創(chuàng)建的異常類(lèi)。
示例如下:
<?php class emailException extends Exception{ function __toString(){ return "<b>email is null</b>file:".$this->getFile().',line:'. $this->getLine(); } } class nameException extends Exception{ } ?>
上述示例中,定義了兩個(gè)異常類(lèi),都繼承自 Exception 基類(lèi)。
在實(shí)際的業(yè)務(wù)中,我們也會(huì)根據(jù)不同的需求來(lái)拋出不同的異常,示例如下:
function reg($reg) { if (empty($reg['email'])) { throw new emailException("emaill is null", 1); } if(empty($reg['name'])) { throw new nameException("name is null", 2); } }
在執(zhí)行業(yè)務(wù)代碼時(shí),可以使用if語(yǔ)句來(lái)判斷異常會(huì)發(fā)生的地方,然后手動(dòng)拋出異常,通過(guò)語(yǔ)句實(shí)現(xiàn)將不同的異常分發(fā)給不同的異常類(lèi)處理;再下面這段示例中,根據(jù)不同的情況捕獲不同的異常,當(dāng)?shù)谝粋€(gè)catch捕獲了異常,即使程序中依然存在其他異常,也會(huì)跳過(guò)其他的catch代碼塊。無(wú)論程序中有沒(méi)有出現(xiàn)異常,最后的finally中的語(yǔ)句都會(huì)執(zhí)行的。示例如下:
try{ $reg = array('phone'=>'1888888888'); reg($reg); } catch(emailException $e) { echo $e; } catch(nameException $e) { echo 'error msg:' .$e->getMessage().'error code:'.$e->getCode(); } finally { echo ' finally'; }
想要了解