国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

php中try catch捕獲異常

2019-11-11 02:30:23
字體:
來源:轉載
供稿:網友

本文實例講述了php中try catch捕獲異常。分享給大家供大家參考。具體方法分析如下:

php中try catch可以幫助我們捕獲程序代碼的異常了,這樣我們可以很好的處理一些不必要的錯誤了,感興趣的朋友可以一起來看看。

PHP中try{}catch{}語句概述

PHP5添加了類似于其它語言的異常處理模塊。在 PHP 代碼中所產生的異??杀?throw語句拋出并被 catch 語句捕獲。(注:一定要先拋才能獲?。?/p>

需要進行異常處理的代碼都必須放入 try 代碼塊內,以便捕獲可能存在的異常。

每一個 try 至少要有一個與之對應的 catch。

使用多個 catch可以捕獲不同的類所產生的異常。

當 try 代碼塊不再拋出異?;蛘哒也坏?catch 能匹配所拋出的異常時,PHP 代碼就會在跳轉到最后一個 catch 的后面繼續執行。

當然,PHP允許在 catch 代碼塊內再次拋出(throw)異常。

當一個異常被拋出時,其后(譯者注:指拋出異常時所在的代碼塊)的代碼將不會繼續執行,而 PHP 就會嘗試查找第一個能與之匹配的 catch。

如果一個異常沒有被捕獲,而且又沒用使用 set_exception_handler() 作相應的處理的話,那么 PHP 將會產生一個嚴重的錯誤,并且輸出 Uncaught Exception … (未捕獲異常)的提示信息。

先來看一下PHP內置異常類的基本屬性和方法。(不包括具體實現) 代碼如下:

try{}catch(){throw new Exception();}catch(){//這里可以捕獲到前面一個塊拋出的Exception}

為了進一步處理異常,我們需要使用PHP中try{}catch{}—-包括Try語句和至少一個的catch語句。任何調用 可能拋出異常的方法的代碼都應該使用try語句。Catch語句用來處理可能拋出的異常。以下顯示了我們處理getCommandObject()拋出的異常的方法: 代碼如下:

<?phptry {$mgr = new CommandManager();$cmd = $mgr->getCommandObject("realcommand");$cmd->execute();} catch (Exception $e) {PRint $e->getMessage();exit();}?>

可以看到,通過結合使用throw關鍵字和PHP中try{}catch{},我們可以避免錯誤標記“污染”類方法返回的值。因為“異?!北旧砭褪且环N與其它任何對象不同的PHP內建的類型,不會產生混淆。

如果拋出了一個異常,try語句中的腳本將會停止執行,然后馬上轉向執行catch語句中的腳本。

例子如下:

包含文件錯誤拋出異常 代碼如下:

<?php// 錯誤的演示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();}

如果異常拋出了卻沒有被捕捉到,就會產生一個fatal error。

多個catch捕獲多個異常

PHP將查詢一個匹配的catch代碼塊。如果有多個catch代碼塊,傳遞給每一個catch代碼塊的對象必須具有不同類型,這樣PHP可以找到需要進入哪一個catch代碼塊。當try代碼塊不再拋出異常或者找不到catch能匹配所拋出的異常時,PHP代碼就會在跳轉最后一個catch的后面繼續執行。多個異常的捕獲的示例如下: 復制代碼 代碼如下:

<?php class MyException extends Exception{ //重定義構造器使第一個參數message變為必須被指定的屬性 public function __construct($message, $code=0){ //可以在這里定義一些自己的代碼 //建議同時調用parent::construct()來檢查所有的變量是否已被賦值 parent::__construct($message, $code); } //重寫父類中繼承過來的方法,自定義字符串輸出的樣式 public function __toString(){ return __CLASS__.":[".$this->code."]:".$this->message."<br>"; } //為這個異常自定義一個處理方法 public function customFunction(){ echo "按自定義的方法處理出現的這個類型的異常"; } } //創建一個用于測試自定義擴展的異常類MyException class TestException{ public $var; //用來判斷對象是否創建成功的成員屬性 function __construct($value=0){ //通過構造方法的傳值決定拋出的異常 switch($value){ //對傳入的值進行選擇性的判斷 case 1: //摻入參數1,則拋出自定義的異常對象 throw new MyException("傳入的值“1”是一個無效的參數",5);break; case 2: //傳入參數2,則拋出PHP內置的異常對象 throw new MyException("傳入的值“2”不允許作為一個參數",6);break; default: //傳入參數合法,則不拋出異常 $this->var=$value;break; //為對象中的成員屬性賦值 } } } //示例1,在沒有異常時,程序正常執行,try中的代碼全部執行并不會執行任何catch區塊 try{ $testObj =new TestException(); //使用默認參數創建異常的擦拭類對象 echo "********<br>"; //沒有拋出異常這條語句就會正常執行 }catch(MyException $e){ //捕獲用戶自定義的異常區塊 echo "捕獲自定義的異常:$e<br>"; //按自定義的方式輸出異常消息 $e->customFunction(); //可以調用自定義的異常處理方法 }catch(Exception $e){ //捕獲PHP內置的異常處理類的對象 echo "捕獲默認的異常:".$e->getMessage()."<br>"; //輸出異常消息 } var_dump($testObj); //判斷對象是否創建成功,如果沒有任何異常,則創建成功 //示例2,拋出自定義的異常,并通過自定義的異常處理類捕獲這個異常并處理 try{ $testObj1 =new TestException(1); //傳1時,拋出自定義異常 echo "********<br>"; //這個語句不會被執行 }catch(MyException $e){ //這個catch區塊中的代碼將被執行 echo "捕獲自定義的異常:$e<br>"; $e->customFunction(); }catch(Exception $e){ //這個catch區塊不會執行 echo "捕獲默認的異常:".$e->getMessage()."<br>"; } var_dump($testObj1); //有異常產生,這個對象沒有創建成功 //示例2,拋出自內置的異常,并通過自定義的異常處理類捕獲這個異常并處理 try{ $testObj2 =new TestException(2); //傳入2時,拋出內置異常 echo "********<br>"; //這個語句不會被執行 }catch(MyException $e){ //這個catch區塊中的代碼將被執行 echo "捕獲自定義的異常:$e<br>"; $e->customFunction(); }catch(Exception $e){ //這個catch區塊不會執行 echo "捕獲默認的異常:".$e->getMessage()."<br>"; } var_dump($testObj2); //有異常產生,這個對象沒有創建成功?>

在上面的代碼中,可以使用兩個異常處理類:一個是自定義的異常處理類MyException;另一個則是PHP中內置的異常處理類Exception。分別在try區塊中創建測試類TestException的對象,并根據構造方法中提供的不同數字參數,拋出自定義異常類對象、內置的異常類對象和不拋出任何異常的情況,跳轉到對應的catch區塊中執行。如果沒有異常發生,則不會進入任何一個catch塊中執行,測試類TestException的對象創建成功

希望本文所述對大家的php程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汉寿县| 偃师市| 河池市| 广州市| 南充市| 巴彦县| 浙江省| 衡东县| 滦南县| 武宣县| 庆城县| 德令哈市| 长治县| 亳州市| 平远县| 潮州市| 鹰潭市| 泉州市| 灌云县| 塘沽区| 河南省| 贵德县| 象山县| 丹棱县| 屯留县| 西乌珠穆沁旗| 黎平县| 体育| 上虞市| 凭祥市| 城口县| 祁东县| 宁都县| 杂多县| 分宜县| 清镇市| 伊吾县| 叶城县| 苏尼特右旗| 绥德县| 屯昌县|