php中,try catch語句配合throw關(guān)鍵字可以用來捕獲程序中的異常,程序代碼中所產(chǎn)生的異??梢员籺ry的throw語句拋出并被catch語句捕獲;語法“try{//代碼}catch(Exception $e){//輸出錯(cuò)誤}”。
本教程操作環(huán)境:windows7系統(tǒng)、PHP7.1版,DELL G3電腦
在 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è)異常類的對(duì)象 // 輸出錯(cuò)誤信息 }
需要進(jìn)行異常處理的代碼都必須放入 try 代碼塊內(nèi),以便捕獲可能存在的異常。每一個(gè) try 至少要有一個(gè)與之對(duì)應(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 捕獲程序中的異常。
<?php try{ $err = '拋出異常信息,并跳出 try 語句塊'; if(is_dir('./test')){ echo '這里是一些可能會(huì)發(fā)生異常的代碼'; }else{ throw new Exception($err, 12345); // 拋出異常 } echo '上面拋出異常的話,這行代碼將不會(huì)執(zhí)行,轉(zhuǎn)而執(zhí)行 catch 中的代碼。<br>'; }catch(Exception $e){ echo '捕獲異常:'.$e->getMessage().'<br>錯(cuò)誤代碼:'.$e->getCode().'<br>'; } 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 類的對(duì)象,通過 new 關(guān)鍵字生成,并且用錯(cuò)誤信息 $err 和錯(cuò)誤代碼 12345 初始化該對(duì)象,以便后面 catch 該異常時(shí)(代碼第 11 行),可以獲取這些信息。
一旦拋出異常,那么 try 語句塊中剩下的代碼就不再繼續(xù)執(zhí)行,程序流程轉(zhuǎn)至相應(yīng)的 catch 語句塊執(zhí)行,最終通過 Exception 對(duì)象調(diào)用其成員函數(shù)輸出錯(cuò)誤信息和代碼。
推薦學(xué)習(xí):《PHP視頻教程》