新聞中心

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


咨詢
建站咨詢
