php中try catch捕獲異常實(shí)例詳解
本文實(shí)例講述了php中try catch捕獲異常。分享給大家供大家參考。具體方法分析如下:
php中try catch可以幫助我們捕獲程序代碼的異常了,這樣我們可以很好的處理一些不必要的錯(cuò)誤了,感興趣的朋友可以一起來看看。
PHP中try{}catch{}語句概述
PHP5添加了類似于其它語言的異常處理模塊。在 PHP 代碼中所產(chǎn)生的異??杀?throw語句拋出并被 catch 語句捕獲。(注:一定要先拋才能獲?。?/p>
需要進(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í)行。
當(dāng)然,PHP允許在 catch 代碼塊內(nèi)再次拋出(throw)異常。
當(dāng)一個(gè)異常被拋出時(shí),其后(譯者注:指拋出異常時(shí)所在的代碼塊)的代碼將不會(huì)繼續(xù)執(zhí)行,而 PHP 就會(huì)嘗試查找第一個(gè)能與之匹配的 catch。
如果一個(gè)異常沒有被捕獲,而且又沒用使用 set_exception_handler() 作相應(yīng)的處理的話,那么 PHP 將會(huì)產(chǎn)生一個(gè)嚴(yán)重的錯(cuò)誤,并且輸出 Uncaught Exception ... (未捕獲異常)的提示信息。
先來看一下PHP內(nèi)置異常類的基本屬性和方法。(不包括具體實(shí)現(xiàn))
}
catch(){
throw new Exception();
}
catch(){
//這里可以捕獲到前面一個(gè)塊拋出的Exception
}
為了進(jìn)一步處理異常,我們需要使用PHP中try{}catch{}----包括Try語句和至少一個(gè)的catch語句。任何調(diào)用 可能拋出異常的方法的代碼都應(yīng)該使用try語句。Catch語句用來處理可能拋出的異常。以下顯示了我們處理getCommandObject()拋出的異常的方法:
try {
$mgr = new CommandManager();
$cmd = $mgr->getCommandObject("realcommand");
$cmd->execute();
} catch (Exception $e) {
print $e->getMessage();
exit();
}
?>
可以看到,通過結(jié)合使用throw關(guān)鍵字和PHP中try{}catch{},我們可以避免錯(cuò)誤標(biāo)記“污染”類方法返回的值。因?yàn)椤爱惓!北旧砭褪且环N與其它任何對(duì)象不同的PHP內(nèi)建的類型,不會(huì)產(chǎn)生混淆。
如果拋出了一個(gè)異常,try語句中的腳本將會(huì)停止執(zhí)行,然后馬上轉(zhuǎn)向執(zhí)行catch語句中的腳本。
例子如下:
包含文件錯(cuò)誤拋出異常
// 錯(cuò)誤的演示
try {
require ('test_try_catch.php');
} catch (Exception $e) {
echo $e->getMessage();
}
// 正確的拋出異常
try {
if (file_exists('test_try_catch.php')) {
require ('test_try_catch.php');
} else {
throw new Exception('file is not exists');
}
} catch (Exception $e) {
echo $e->getMessage();
}
如果異常拋出了卻沒有被捕捉到,就會(huì)產(chǎn)生一個(gè)fatal error。
多個(gè)catch捕獲多個(gè)異常
PHP將查詢一個(gè)匹配的catch代碼塊。如果有多個(gè)catch代碼塊,傳遞給每一個(gè)catch代碼塊的對(duì)象必須具有不同類型,這樣PHP可以找到需要進(jìn)入哪一個(gè)catch代碼塊。當(dāng)try代碼塊不再拋出異?;蛘哒也坏絚atch能匹配所拋出的異常時(shí),PHP代碼就會(huì)在跳轉(zhuǎn)最后一個(gè)catch的后面繼續(xù)執(zhí)行。多個(gè)異常的捕獲的示例如下:
class MyException extends Exception{
//重定義構(gòu)造器使第一個(gè)參數(shù)message變?yōu)楸仨毐恢付ǖ膶傩?br /> public function __construct($message, $code=0){
//可以在這里定義一些自己的代碼
//建議同時(shí)調(diào)用parent::construct()來檢查所有的變量是否已被賦值
parent::__construct($message, $code);
}
//重寫父類中繼承過來的方法,自定義字符串輸出的樣式
public function __toString(){
return __CLASS__.":[".$this->code."]:".$this->message."<br>";
}
//為這個(gè)異常自定義一個(gè)處理方法
public function customFunction(){
echo "按自定義的方法處理出現(xiàn)的這個(gè)類型的異常";
}
}
//創(chuàng)建一個(gè)用于測試自定義擴(kuò)展的異常類MyException
class TestException{
public $var; //用來判斷對(duì)象是否創(chuàng)建成功的成員屬性
function __construct($value=0){ //通過構(gòu)造方法的傳值決定拋出的異常
switch($value){ //對(duì)傳入的值進(jìn)行選擇性的判斷
case 1: //摻入?yún)?shù)1,則拋出自定義的異常對(duì)象
throw new MyException("傳入的值“1”是一個(gè)無效的參數(shù)",5);break;
case 2: //傳入?yún)?shù)2,則拋出PHP內(nèi)置的異常對(duì)象
throw new MyException("傳入的值“2”不允許作為一個(gè)參數(shù)",6);break;
default: //傳入?yún)?shù)合法,則不拋出異常
$this->var=$value;break; //為對(duì)象中的成員屬性賦值
}
}
}
//示例1,在沒有異常時(shí),程序正常執(zhí)行,try中的代碼全部執(zhí)行并不會(huì)執(zhí)行任何catch區(qū)塊
try{
$testObj =new TestException(); //使用默認(rèn)參數(shù)創(chuàng)建異常的擦拭類對(duì)象
echo "********<br>"; //沒有拋出異常這條語句就會(huì)正常執(zhí)行
}catch(MyException $e){ //捕獲用戶自定義的異常區(qū)塊
echo "捕獲自定義的異常:$e<br>"; //按自定義的方式輸出異常消息
$e->customFunction(); //可以調(diào)用自定義的異常處理方法
}catch(Exception $e){ //捕獲PHP內(nèi)置的異常處理類的對(duì)象
echo "捕獲默認(rèn)的異常:".$e->getMessage()."<br>"; //輸出異常消息
}
var_dump($testObj); //判斷對(duì)象是否創(chuàng)建成功,如果沒有任何異常,則創(chuàng)建成功
//示例2,拋出自定義的異常,并通過自定義的異常處理類捕獲這個(gè)異常并處理
try{
$testObj1 =new TestException(1); //傳1時(shí),拋出自定義異常
echo "********<br>"; //這個(gè)語句不會(huì)被執(zhí)行
}catch(MyException $e){ //這個(gè)catch區(qū)塊中的代碼將被執(zhí)行
echo "捕獲自定義的異常:$e<br>";
$e->customFunction();
}catch(Exception $e){ //這個(gè)catch區(qū)塊不會(huì)執(zhí)行
echo "捕獲默認(rèn)的異常:".$e->getMessage()."<br>";
}
var_dump($testObj1); //有異常產(chǎn)生,這個(gè)對(duì)象沒有創(chuàng)建成功
//示例2,拋出自內(nèi)置的異常,并通過自定義的異常處理類捕獲這個(gè)異常并處理
try{
$testObj2 =new TestException(2); //傳入2時(shí),拋出內(nèi)置異常
echo "********<br>"; //這個(gè)語句不會(huì)被執(zhí)行
}catch(MyException $e){ //這個(gè)catch區(qū)塊中的代碼將被執(zhí)行
echo "捕獲自定義的異常:$e<br>";
$e->customFunction();
}catch(Exception $e){ //這個(gè)catch區(qū)塊不會(huì)執(zhí)行
echo "捕獲默認(rèn)的異常:".$e->getMessage()."<br>";
}
var_dump($testObj2); //有異常產(chǎn)生,這個(gè)對(duì)象沒有創(chuàng)建成功
?>
在上面的代碼中,可以使用兩個(gè)異常處理類:一個(gè)是自定義的異常處理類MyException;另一個(gè)則是PHP中內(nèi)置的異常處理類Exception。分別在try區(qū)塊中創(chuàng)建測試類TestException的對(duì)象,并根據(jù)構(gòu)造方法中提供的不同數(shù)字參數(shù),拋出自定義異常類對(duì)象、內(nèi)置的異常類對(duì)象和不拋出任何異常的情況,跳轉(zhuǎn)到對(duì)應(yīng)的catch區(qū)塊中執(zhí)行。如果沒有異常發(fā)生,則不會(huì)進(jìn)入任何一個(gè)catch塊中執(zhí)行,測試類TestException的對(duì)象創(chuàng)建成功
希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。
相關(guān)文章
PHP發(fā)送郵件確認(rèn)驗(yàn)證注冊(cè)功能示例【修改別人郵件類】
這篇文章主要介紹了PHP發(fā)送郵件確認(rèn)驗(yàn)證注冊(cè)功能,結(jié)合實(shí)例形式分析了PHP開源郵件操作類的修改與使用技巧,需要的朋友可以參考下2019-11-11
PHP獲取和操作配置文件php.ini的幾個(gè)函數(shù)介紹
當(dāng)你沒辦法修改php.ini配置文件怎么辦,沒事,php有一套設(shè)置和獲取配置信息的函數(shù)2013-06-06
Paypal實(shí)現(xiàn)循環(huán)扣款(訂閱)功能
本文主要介紹了Paypal實(shí)現(xiàn)循環(huán)扣款(訂閱)的思路與方法;并對(duì)如何使用Paypal的支付接口下總結(jié),具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-03-03
關(guān)于php操作mysql執(zhí)行數(shù)據(jù)庫查詢的一些常用操作匯總
本篇文章是對(duì)關(guān)于php操作mysql執(zhí)行數(shù)據(jù)庫查詢的一些常用操作進(jìn)行了詳細(xì)的匯總介紹,需要的朋友參考下2013-06-06
php實(shí)現(xiàn)的支持?jǐn)帱c(diǎn)續(xù)傳的文件下載類
這篇文章主要介紹了php實(shí)現(xiàn)的支持?jǐn)帱c(diǎn)續(xù)傳的文件下載類及其用法實(shí)例,詳細(xì)講述了PHP實(shí)現(xiàn)斷點(diǎn)續(xù)傳下載的原理及代碼實(shí)現(xiàn)方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-09-09
PHP實(shí)現(xiàn)利用MySQL保存session的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)利用MySQL保存session的方法,是PHP程序設(shè)計(jì)中比較有實(shí)用價(jià)值的一個(gè)技巧,需要的朋友可以參考下2014-08-08

