新聞中心

成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)商都,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):13518219792
在 Java、C# 及 Python 等語(yǔ)言中很早就提供了這種異常處理機(jī)制,如果你對(duì)哪一種語(yǔ)言中的異常處理熟悉,那對(duì) PHP 中提供的異常處理機(jī)制也就不會(huì)陌生了。
異常處理的加入使得在 PHP 程序中排查錯(cuò)誤、捕獲異常更加簡(jiǎn)單容易,也使得 PHP 程序在健壯性方面有很大改善和提高。異常處理在 PHP 中的具體體現(xiàn)就是,PHP 提供了一個(gè)名叫 Exception 的類(lèi)完成對(duì) PHP 程序異常的處理,這個(gè)類(lèi)包含了一些處理異常的函數(shù),這些函數(shù)可以捕獲程序異常和錯(cuò)誤。
本節(jié)我們就來(lái)介紹一下 PHP 中的異常處理類(lèi)及類(lèi)函數(shù)的用法。
PHP 中的異常處理類(lèi)
PHP 中提供了內(nèi)置的異常處理類(lèi)——Exception,該類(lèi)中常用的成員函數(shù)如下所示:
- getMessage():返回異常的消息內(nèi)容;
- getCode():以數(shù)字形式返回異常代碼;
- getFile():返回發(fā)生異常的文件名;
- getLine():返回發(fā)生錯(cuò)誤的代碼行號(hào);
- getTrace():返回 backtrace() 數(shù)組;
- getTraceAsString():返回已格式化成字符串的、由函數(shù) getTrace() 函數(shù)所產(chǎn)生的信息;
- __toString():產(chǎn)生異常的字符串信息,它可以重載。注意,該函數(shù)最前部是兩個(gè)下劃線(xiàn)。
下面代碼是 Exception 類(lèi)的完整代碼,從這個(gè)類(lèi)的定義可以看出哪些屬性和方法(成員函數(shù))在用戶(hù)派生的子類(lèi)中是可以訪(fǎng)問(wèn)和繼承的。
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 語(yǔ)句和 throw 關(guān)鍵字來(lái)實(shí)現(xiàn)。try catch 語(yǔ)句和流程控制語(yǔ)句類(lèi)似,所以可以通過(guò) try catch 語(yǔ)句來(lái)實(shí)現(xiàn)一種另類(lèi)的條件選擇結(jié)構(gòu),而 throw 關(guān)鍵字則可以?huà)伋鲆粋€(gè)異常。try catch 語(yǔ)句的語(yǔ)法格式如下:
try{
// 可能出現(xiàn)異?;蝈e(cuò)誤的代碼,比如文件操作、數(shù)據(jù)庫(kù)操作等
}catch(Exception $e){ // $e 為一個(gè)異常類(lèi)的對(duì)象
// 輸出錯(cuò)誤信息
}
需要進(jìn)行異常處理的代碼都必須放入 try 代碼塊內(nèi),以便捕獲可能存在的異常。每一個(gè) try 至少要有一個(gè)與之對(duì)應(yīng)的 catch。使用多個(gè) catch 可以捕獲不同的類(lèi)所產(chǎn)生的異常。
當(dāng) try 代碼塊不再拋出異?;蛘哒也坏?catch 能匹配所拋出的異常時(shí),PHP 代碼就會(huì)在跳轉(zhuǎn)到最后一個(gè) catch 的后面繼續(xù)執(zhí)行。
在 PHP 代碼中所產(chǎn)生的異??梢员?throw 語(yǔ)句拋出并被 catch 語(yǔ)句捕獲。當(dāng)然,PHP 允許在 catch 代碼塊內(nèi)再次拋出(throw)異常。
當(dāng)一個(gè)異常被拋出時(shí),其后的代碼不會(huì)再繼續(xù)執(zhí)行,而 PHP 就會(huì)嘗試?yán)^續(xù)查找第一個(gè)能與之匹配的 catch。如果一個(gè)異常沒(méi)有被捕獲,而且又沒(méi)用使用 set_exception_handler() 作相應(yīng)的處理的話(huà),將會(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ǔ)句之外的代碼';
?>
運(yùn)行結(jié)果如下:
捕獲異常:拋出異常信息,并跳出 try 語(yǔ)句塊
錯(cuò)誤代碼:12345
繼續(xù)執(zhí)行 try catch 語(yǔ)句之外的代碼
示例代碼中,在 try 語(yǔ)句塊中試著判斷當(dāng)前目錄下是否存在名為 test 的目錄,如果不存在這個(gè)目錄,那么就會(huì)執(zhí)行第 7 行的代碼,通過(guò)關(guān)鍵字 throw 拋出異常。這個(gè)異常是一個(gè) Exception 類(lèi)的對(duì)象,通過(guò) new 關(guān)鍵字生成,并且用錯(cuò)誤信息 $err 和錯(cuò)誤代碼 12345 初始化該對(duì)象,以便后面 catch 該異常時(shí)(代碼第 11 行),可以獲取這些信息。
一旦拋出異常,那么 try 語(yǔ)句塊中剩下的代碼就不再繼續(xù)執(zhí)行,程序流程轉(zhuǎn)至相應(yīng)的 catch 語(yǔ)句塊執(zhí)行,最終通過(guò) Exception 對(duì)象調(diào)用其成員函數(shù)輸出錯(cuò)誤信息和代碼。
PHP 創(chuàng)建自己的異常類(lèi)
在各種語(yǔ)言里,對(duì)異常和錯(cuò)誤的定義不同。在 PHP 里遇到任何錯(cuò)誤都會(huì)拋出一個(gè)錯(cuò)誤,很少會(huì)主動(dòng)拋出異常,不像 Java 語(yǔ)言那樣會(huì)預(yù)先定義好各種異常類(lèi),當(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)建的異常類(lèi)。
下面定義兩個(gè)異常類(lèi),都繼承自 Exception 基類(lèi)。
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 語(yǔ)句判斷異常會(huì)發(fā)生的地方,然后手動(dòng)拋出異常,將不同的異常分發(fā)給不同的異常類(lèi)處理,如下所示:
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ì)跳過(guò)其他的 catch 代碼塊,但是不管程序中是否出現(xiàn)異常,最終 finally 中的語(yǔ)句都會(huì)執(zhí)行。
執(zhí)行以上程序的結(jié)果為:
email is null file:/Library/WebServer/Documents/book/try.php,line:39 finally
標(biāo)題名稱(chēng):PHP異常處理(Exception)
瀏覽路徑:http://fisionsoft.com.cn/article/cooojch.html


咨詢(xún)
建站咨詢(xún)
