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

首頁 > 開發 > PHP > 正文

php中try catch 捕獲異常的例

2024-05-04 21:49:29
字體:
來源:轉載
供稿:網友

php中try catch可以幫助我們捕獲程序代碼的異常了,這樣我們可以很好的處理一些不必要的錯誤了,下面本文章總結了捕獲異常的一些用法例子.

PHP中try{}catch{}語句.

PHP 5 添加了類似于其它語言的異常處理模塊,在 PHP 代碼中所產生的異常可被 throw語句拋出并被 catch 語句捕獲,注,一定要先拋才能獲取.

需要進行異常處理的代碼都必須放入 try 代碼塊內,以便捕獲可能存在的異常,每一個 try 至少要有一個與之對應的 catch.

使用多個 catch可以捕獲不同的類所產生的異常,當 try 代碼塊不再拋出異常或者找不到 catch 能匹配所拋出的異常時,PHP 代碼就會在跳轉到最后一個 catch 的后面繼續執行.

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

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

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

  1. try{ 
  2. catch(){ 
  3. throw new Exception(); 
  4. catch(){ 
  5. //這里可以捕獲到前面一個塊拋出的Exception 

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

  1. <?php    
  2. try {    
  3. $mgr = new CommandManager();    
  4. $cmd = $mgr->getCommandObject("realcommand");    
  5. $cmd->execute();    
  6. } catch (Exception $e) {    
  7. print $e->getMessage();    
  8. exit();    
  9. }    
  10. ?> 

可以看到,通過結合使用throw關鍵字和PHP中try{}catch{},我們可以避免錯誤標記“污染”類方法返回的值,因為“異常”本身就是一種與其它任何對象不同的PHP內建的類型,不會產生混淆.

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

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

  1. <?php 
  2. // 錯誤的演示 
  3. try { 
  4. require ('test_try_catch.php'); 
  5. } catch (Exception $e) { 
  6. echo $e->getMessage(); 
  7.  
  8. // 正確的拋出異常 
  9. try { 
  10. if (file_exists('test_try_catch.php')) { 
  11. require ('test_try_catch.php'); 
  12. else { 
  13. throw new Exception('file is not exists'); 
  14. } catch (Exception $e) { 
  15. echo $e->getMessage(); 
  16. ?> 

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

多個catch捕獲多個異常

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

  1. <?php  
  2.     class MyException extends Exception{ 
  3.            //重定義構造器使第一個參數message變為必須被指定的屬性 
  4.            public function __construct($message$code=0){ 
  5.                //可以在這里定義一些自己的代碼 
  6.                //建議同時調用parent::construct()來檢查所有的變量是否已被賦值 
  7.                parent::__construct($message$code); 
  8.            } 
  9.            //重寫父類中繼承過來的方法,自定義字符串輸出的樣式 
  10.            public function __toString(){ 
  11.                return __CLASS__.":[".$this->code."]:".$this->message."<br>"
  12.            } 
  13.            //為這個異常自定義一個處理方法 
  14.            public function customFunction(){ 
  15.                echo "按自定義的方法處理出現的這個類型的異常"
  16.            } 
  17.     } 
  18.  
  19.     //創建一個用于測試自定義擴展的異常類MyException 
  20.     class TestException{ 
  21.         public $var;           //用來判斷對象是否創建成功的成員屬性 
  22.         function __construct($value=0){              //通過構造方法的傳值決定拋出的異常 
  23.             switch($value){                          //對傳入的值進行選擇性的判斷 
  24.                 case 1:                              //摻入參數1,則拋出自定義的異常對象 
  25.                     throw new MyException("傳入的值“1”是一個無效的參數",5);break
  26.                 case 2:                              //傳入參數2,則拋出PHP內置的異常對象 
  27.                     throw new MyException("傳入的值“2”不允許作為一個參數",6);break
  28.                 default:                             //傳入參數合法,則不拋出異常 
  29.                     $this->var=$value;break;          //為對象中的成員屬性賦值 
  30.             } 
  31.         } 
  32.     } 
  33.  
  34.     //示例1,在沒有異常時,程序正常執行,try中的代碼全部執行并不會執行任何catch區塊 
  35.     try{ 
  36.         $testObj =new TestException();           //使用默認參數創建異常的擦拭類對象 
  37.         echo "********<br>";                     //沒有拋出異常這條語句就會正常執行 
  38.     }catch(MyException $e){                      //捕獲用戶自定義的異常區塊 
  39.         echo "捕獲自定義的異常:$e<br>";          //按自定義的方式輸出異常消息 
  40.         $e->customFunction();                    //可以調用自定義的異常處理方法 
  41.     }catch(Exception $e){                        //捕獲PHP內置的異常處理類的對象 
  42.         echo "捕獲默認的異常:".$e->getMessage()."<br>";       //輸出異常消息 
  43.     } 
  44.     var_dump($testObj);        //判斷對象是否創建成功,如果沒有任何異常,則創建成功 
  45.  
  46.     //示例2,拋出自定義的異常,并通過自定義的異常處理類捕獲這個異常并處理 
  47.     try{ 
  48.         $testObj1 =new TestException(1);         //傳1時,拋出自定義異常 
  49.         echo "********<br>";                     //這個語句不會被執行 
  50.     }catch(MyException $e){                      //這個catch區塊中的代碼將被執行 
  51.         echo "捕獲自定義的異常:$e<br>";           
  52.         $e->customFunction();                     
  53.     }catch(Exception $e){                        //這個catch區塊不會執行 
  54.         echo "捕獲默認的異常:".$e->getMessage()."<br>";        
  55.     } 
  56.     var_dump($testObj1);        //有異常產生,這個對象沒有創建成功 
  57.  
  58.     //示例2,拋出自內置的異常,并通過自定義的異常處理類捕獲這個異常并處理 
  59.     try{ 
  60.         $testObj2 =new TestException(2);         //傳入2時,拋出內置異常 
  61.         echo "********<br>";                     //這個語句不會被執行 
  62.     }catch(MyException $e){                      //這個catch區塊中的代碼將被執行 
  63.         echo "捕獲自定義的異常:$e<br>";           
  64.         $e->customFunction();                     
  65.     }catch(Exception $e){                        //這個catch區塊不會執行 
  66.         echo "捕獲默認的異常:".$e->getMessage()."<br>";        
  67.     }//開源軟件:Vevb.com 
  68.     var_dump($testObj2);        //有異常產生,這個對象沒有創建成功 
  69. ?> 

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 邻水| 民县| 清水县| 西峡县| 门源| 盐山县| 三明市| 宜都市| 沙坪坝区| 大名县| 广德县| 富裕县| 平凉市| 津市市| 平阴县| 和顺县| 旬阳县| 临泉县| 泸定县| 河西区| 新密市| 沾益县| 长治市| 洞头县| 临澧县| 东明县| 获嘉县| 抚远县| 牡丹江市| 兴化市| 东宁县| 凉山| 会宁县| 金昌市| 汝南县| 虎林市| 万盛区| 新平| 门源| 青河县| 绥化市|