掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流

成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)商都,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792
在 Java、C# 及 Python 等語言中很早就提供了這種異常處理機(jī)制,如果你對哪一種語言中的異常處理熟悉,那對 PHP 中提供的異常處理機(jī)制也就不會(huì)陌生了。
異常處理的加入使得在 PHP 程序中排查錯(cuò)誤、捕獲異常更加簡單容易,也使得 PHP 程序在健壯性方面有很大改善和提高。異常處理在 PHP 中的具體體現(xiàn)就是,PHP 提供了一個(gè)名叫 Exception 的類完成對 PHP 程序異常的處理,這個(gè)類包含了一些處理異常的函數(shù),這些函數(shù)可以捕獲程序異常和錯(cuò)誤。
本節(jié)我們就來介紹一下 PHP 中的異常處理類及類函數(shù)的用法。
PHP 中提供了內(nèi)置的異常處理類——Exception,該類中常用的成員函數(shù)如下所示:
下面代碼是 Exception 類的完整代碼,從這個(gè)類的定義可以看出哪些屬性和方法(成員函數(shù))在用戶派生的子類中是可以訪問和繼承的。
Exception {
/* 屬性 */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* 方法 */
public __construct ([ string $message = "" [, int $code = 0 [, Throwable $previous = NULL ]]] )
final public getMessage ( void ) : string
final public getPrevious ( void ) : Throwable
final public getCode ( void ) : int
final public getFile ( void ) : string
final public getLine ( void ) : int
final public getTrace ( void ) : array
final public getTraceAsString ( void ) : string
public __toString ( void ) : string
final private __clone ( void ) : void
}
在 PHP 中想要捕獲程序中的異常,需要使用 try catch 語句和 throw 關(guān)鍵字來實(shí)現(xiàn)。try catch 語句和流程控制語句類似,所以可以通過 try catch 語句來實(shí)現(xiàn)一種另類的條件選擇結(jié)構(gòu),而 throw 關(guān)鍵字則可以拋出一個(gè)異常。try catch 語句的語法格式如下:
try{
// 可能出現(xiàn)異?;蝈e(cuò)誤的代碼,比如文件操作、數(shù)據(jù)庫操作等
}catch(Exception $e){ // $e 為一個(gè)異常類的對象
// 輸出錯(cuò)誤信息
}
需要進(jìn)行異常處理的代碼都必須放入 try 代碼塊內(nèi),以便捕獲可能存在的異常。每一個(gè) try 至少要有一個(gè)與之對應(yīng)的 catch。使用多個(gè) catch 可以捕獲不同的類所產(chǎn)生的異常。
當(dāng) try 代碼塊不再拋出異常或者找不到 catch 能匹配所拋出的異常時(shí),PHP 代碼就會(huì)在跳轉(zhuǎn)到最后一個(gè) catch 的后面繼續(xù)執(zhí)行。
在 PHP 代碼中所產(chǎn)生的異??梢员?throw 語句拋出并被 catch 語句捕獲。當(dāng)然,PHP 允許在 catch 代碼塊內(nèi)再次拋出(throw)異常。
當(dāng)一個(gè)異常被拋出時(shí),其后的代碼不會(huì)再繼續(xù)執(zhí)行,而 PHP 就會(huì)嘗試?yán)^續(xù)查找第一個(gè)能與之匹配的 catch。如果一個(gè)異常沒有被捕獲,而且又沒用使用 set_exception_handler() 作相應(yīng)的處理的話,將會(huì)產(chǎn)生一個(gè)嚴(yán)重的錯(cuò)誤,并且輸出 UncaughtException...(未捕獲異常)的提示信息。
【示例】使用 try catch 和 throw 捕獲程序中的異常。
';
}catch(Exception $e){
echo '捕獲異常:'.$e->getMessage().'
錯(cuò)誤代碼:'.$e->getCode().'
';
}
echo '繼續(xù)執(zhí)行 try catch 語句之外的代碼';
?>
運(yùn)行結(jié)果如下:
捕獲異常:拋出異常信息,并跳出 try 語句塊
錯(cuò)誤代碼:12345
繼續(xù)執(zhí)行 try catch 語句之外的代碼
示例代碼中,在 try 語句塊中試著判斷當(dāng)前目錄下是否存在名為 test 的目錄,如果不存在這個(gè)目錄,那么就會(huì)執(zhí)行第 7 行的代碼,通過關(guān)鍵字 throw 拋出異常。這個(gè)異常是一個(gè) Exception 類的對象,通過 new 關(guān)鍵字生成,并且用錯(cuò)誤信息 $err 和錯(cuò)誤代碼 12345 初始化該對象,以便后面 catch 該異常時(shí)(代碼第 11 行),可以獲取這些信息。
一旦拋出異常,那么 try 語句塊中剩下的代碼就不再繼續(xù)執(zhí)行,程序流程轉(zhuǎn)至相應(yīng)的 catch 語句塊執(zhí)行,最終通過 Exception 對象調(diào)用其成員函數(shù)輸出錯(cuò)誤信息和代碼。
在各種語言里,對異常和錯(cuò)誤的定義不同。在 PHP 里遇到任何錯(cuò)誤都會(huì)拋出一個(gè)錯(cuò)誤,很少會(huì)主動(dòng)拋出異常,不像 Java 語言那樣會(huì)預(yù)先定義好各種異常類,當(dāng)程序執(zhí)行到異常處的代碼時(shí)會(huì)主動(dòng)拋出。
PHP 的異常處理機(jī)制并不完善,在 PHP 中想處理不可預(yù)料的異常是辦不到的,必須事先定義一些異常,將各種可能出現(xiàn)的異常進(jìn)行 if…else 判斷,手動(dòng)拋出異常,所以在 PHP 里經(jīng)常會(huì)使用到我們自己創(chuàng)建的異常類。
下面定義兩個(gè)異常類,都繼承自 Exception 基類。
class emailException extends Exception{
function __toString(){
return "email is nullfile:".$this->getFile().',line:'. $this->getLine();
}
}
class nameException extends Exception{
}
在實(shí)際業(yè)務(wù)中可根據(jù)不同需求拋出不同異常,業(yè)務(wù)代碼如下:
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 語句判斷異常會(huì)發(fā)生的地方,然后手動(dòng)拋出異常,將不同的異常分發(fā)給不同的異常類處理,如下所示:
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';
}
這段程序根據(jù)不同的情況捕獲不同的異常,如果第一個(gè) catch 捕獲了異常,即使程序中仍然存在其他異常,也會(huì)跳過其他的 catch 代碼塊,但是不管程序中是否出現(xiàn)異常,最終 finally 中的語句都會(huì)執(zhí)行。
執(zhí)行以上程序的結(jié)果為:
email is null file:/Library/WebServer/Documents/book/try.php,line:39 finally

我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流