異常機(jī)制
成都服務(wù)器托管,創(chuàng)新互聯(lián)建站提供包括服務(wù)器租用、內(nèi)江機(jī)房主機(jī)托管、帶寬租用、云主機(jī)、機(jī)柜租用、主機(jī)租用托管、CDN網(wǎng)站加速、域名注冊(cè)等業(yè)務(wù)的一體化完整服務(wù)。電話咨詢:028-86922220
一.異?;局R(shí)
1.定義:異常處理用于在指定的錯(cuò)誤(異常)情況發(fā)生時(shí)改變腳本的正常流程,這過(guò)程稱為異常.
2.基本用法:
try
{
//可能出現(xiàn)的錯(cuò)誤(異常)代碼
}
catch(Exception $e)
{
//自己處理:捕捉異常并處理,
//自己不處理:拋出一個(gè)異常,即如下:
throw $e;
}
其中,Exception是異常類(php中定義好的一個(gè)類,具體參見php參考文檔:語(yǔ)音參考->異常處理).它已經(jīng)封裝好很多方法,常用如下:
function __construct($message = null, $code = 0);
final function getMessage(); // 返回異常信息
final function getCode(); // 返回異常代碼
final function getFile(); // 返回發(fā)生異常的文件名
final function getLine(); // 返回發(fā)生異常的代碼行號(hào)
final function getTrace(); // backtrace() 數(shù)組
final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息
/* 可重載的方法 */
function __toString(); // 可輸出的字符串
3.入門案例
案例1:
<?php try{ adduser("weimin"); echo "adduser()如果出現(xiàn)異常,這句話就不會(huì)出現(xiàn)<br>"; updateuser("wly1"); echo "updateuser()如果出現(xiàn)異常,這句話就不會(huì)出現(xiàn)<br>"; } catch(Exception $e) { echo "error!".$e->getMessage(); //getMessage()為異常中一個(gè)函數(shù),可返回異常信息 } function adduser($username) { if($username=="weimin") { } else { throw new Exception("添加失敗");//拋出異常,及返回一個(gè)異常 } } function updateuser($username) { if($username=="wly") { } else { throw new Exception("修改失敗");//拋出異常 } } ?>
結(jié)果:
adduser()如果出現(xiàn)異常,這句話就不會(huì)出現(xiàn)
error!修改失敗
來(lái)自 <http://localhost/exception/exception01.php>
二.異常使用的注意事項(xiàng)
1.異常的基本處理:
(1).當(dāng)異常被拋出,其后的代碼不會(huì)繼續(xù)執(zhí)行,php嘗試查找匹配的catch代碼塊;見案例1.
(2).如果異常沒有被捕獲,而且有沒有使用set_exception_handler()做相應(yīng)的處理,那么會(huì)發(fā)生一個(gè)嚴(yán)重的錯(cuò)誤(致命錯(cuò)誤),并輸出"Uncaught Exception"(未捕獲異常)的錯(cuò)誤消息;
(3).當(dāng)catch一個(gè)異常,可以進(jìn)行處理或者不進(jìn)行處理(在catch函數(shù)中,直接拋出異常,即 throw $e,這時(shí)將啟動(dòng)php系統(tǒng)默認(rèn)異常處理器(函數(shù))來(lái)處理,見案例2?;蛘咦约憾x一個(gè)頂級(jí)異常處理器(函數(shù)),見案例3);
通俗理解:即第一次拋出異常后,使用try{},ctach{}捕獲到第一次拋出的異常,這時(shí)我們?nèi)绻粚?duì)第一次拋出的異常進(jìn)行處理,可以將此異常進(jìn)行第二次拋出,這時(shí),此異常將交給php默認(rèn)異常處理器(函數(shù))進(jìn)行處理,或者交給用戶自己定義的頂級(jí)異常處理器(函數(shù))進(jìn)行處理。
其中,定義頂級(jí)異常處理,需要兩個(gè)步驟:
步驟一:定義頂級(jí)異常處理函數(shù);
步驟二:修改默認(rèn)定義異常處理函數(shù)set_exception_handler("函數(shù)名");
案例2:
<?php function A1($val) { if($val=="A") { throw new Exception ("不要輸入A");//第一次拋出異常 } } function B1($val) { if($val=="B") { throw new Exception ("不要輸入B");//第一次拋出異常 } } try { A1("A"); } catch(Exception $e) { throw $e; //第二次拋出異常 /*捕獲異常后,繼續(xù)拋出異常(第二次拋出異常),這時(shí)候?qū)?huì)啟動(dòng)php默認(rèn)的異常處理器來(lái)處理, 也可以自己定義一個(gè)頂級(jí)異常處理*/ } ?>
結(jié)果:
Fatal error: Uncaught exception 'Exception' with message '不要輸入A' in E:\Software_default\wamp_wwwroot\exception\exception02.php:6 Stack trace: #0 E:\Software_default\wamp_wwwroot\exception\exception02.php(18): A1('A') #1 {main} thrown in E:\Software_default\wamp_wwwroot\exception\exception02.phpon line 6
來(lái)自 <http://localhost/exception/exception02.php>
案例3:
<?php function MyException($e)//用戶定義的頂級(jí)異常處理函數(shù) { echo "<b>我是頂級(jí)異常處理函數(shù),</b>其中,異常信息為:".$e->getMessage(); } set_exception_handler("MyException");//修改默認(rèn)的頂級(jí)異常處理函數(shù) function A1($val) { if($val=="A") throw new Exception ("不要輸入A");//拋出異常 } function B1($val) { if($val=="B") throw new Exception ("不要輸入B"); } try { A1("A"); } catch(Exception $e) { throw $e; /*繼續(xù)拋出異常,這時(shí)候?qū)?huì)啟動(dòng)php默認(rèn)的異常處理器來(lái)處理, 也可以自己定義一個(gè)頂級(jí)異常處理*/ } ?>
結(jié)果:
我是頂級(jí)異常處理函數(shù),其中,異常信息為:不要輸入A
來(lái)自 <http://localhost/exception/exception03.php>
(4).如果拋出一個(gè)異常,就必須捕獲它(否則會(huì)報(bào)錯(cuò),產(chǎn)生Fatal error錯(cuò)誤),或者使用用戶定義的頂級(jí)異常處理函數(shù)進(jìn)行處理
2.也可以自己定義一個(gè)異常類
class MyException Exception
{
}
3.使用多個(gè)catch代碼塊可以捕獲不同種類的異常
(1).基本用法
try
{
//代碼
//可能拋出多種異常
}
catch(PDOException $e)//數(shù)據(jù)庫(kù)異常
{
//代碼
}
catch(Exception $e)
{
//代碼
}
(2).案例
案例4:
<?php //定義一個(gè)異常類 class MyException1 extends Exception{ } class MyException2 extends Exception{ } function A() { throw new MyException1("a"); } function B() { throw new MyException1("b"); } function C() { try{ A();//拋出MyException1 B();//拋出MyException2 } catch(Exception1 $e1){ echo $e1->getMessage(); } catch(Exception2 $e2){ echo $e2>getMessage(); } } C(); ?>
結(jié)果:
Fatal error: Uncaught exception 'MyException1' with message 'a' in E:\Software_default\wamp_wwwroot\exception\exception04.php:12 Stack trace: #0 E:\Software_default\wamp_wwwroot\exception\exception04.php(21): A() #1 E:\Software_default\wamp_wwwroot\exception\exception04.php(31): C() #2 {main} thrown in E:\Software_default\wamp_wwwroot\exception\exception04.phpon line 12
來(lái)自 <http://localhost/exception/exception04.php>
由于產(chǎn)生不捕獲的異常,php默認(rèn)顯示其異常處理函數(shù),這時(shí),我們添加用戶自定義的頂級(jí)處理函數(shù)
案例5:
<?php //定義一個(gè)異常類 class MyException1 extends Exception{ } class MyException2 extends Exception{ } function MyException($e) { echo "<b>我是頂級(jí)異常處理函數(shù),</b>其中,異常信息為:".$e->getMessage(); } set_exception_handler("MyException");//修改默認(rèn)的頂級(jí)異常處理函數(shù) function A() { throw new MyException1("a"); } function B() { throw new MyException1("b"); } function C() { try{ A();//拋出MyException1 B();//拋出MyException2 } catch(Exception1 $e1){//Exception1 是異常類名 echo $e1->getMessage(); } catch(Exception2 $e2){//Exception2是異常類名 echo $e2>getMessage(); } } C(); ?>
結(jié)果:
我是頂級(jí)異常處理函數(shù),其中,異常信息為:a
來(lái)自 <http://localhost/exception/exception05.php>
3.PHP異常拋出的BUG
案例6:
<?php try{ $a=8/0; } catch(Exception $e){ echo $e->getMessage(); echo "異常"; } ?>
結(jié)果:
Warning: Division by zero in E:\Software_default\wamp_wwwroot\exception\exception06.phpon line 3
來(lái)自 <http://localhost/exception/exception06.php>
在案例6中,8/0,php認(rèn)為是錯(cuò)誤,而不是異常,所以,沒有拋出異常,因此捕獲不到異常
案例7:
<?php try{ $f=fopen("aa.txt","r");//aa.txt在當(dāng)前路徑下并不存在 } catch(Exception $e){ echo $e->getMessage(); echo "異常"; } ?>
結(jié)果:
Warning: fopen(aa.txt) [function.fopen]: failed to open stream: No such file or directory in E:\Software_default\wamp_wwwroot\exception\exception07.phpon line 3
來(lái)自 <http://localhost/exception/exception07.php>
在案例7中, fopen()是一個(gè)很老的函數(shù),從php1就已經(jīng)存在了,當(dāng)時(shí)并沒有異常處理機(jī)制,php認(rèn)為是錯(cuò)誤,而不是異常,所以,沒有拋出異常,因此捕獲不到異常
網(wǎng)頁(yè)名稱:詳細(xì)解讀php的異常處理機(jī)制
分享鏈接:http://aaarwkj.com/article12/jjgjgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、小程序開發(fā)、域名注冊(cè)、定制開發(fā)、外貿(mào)建站、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)