php中try catch捕獲異常執行個體詳解_php技巧

來源:互聯網
上載者:User

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

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

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

PHP5添加了類似於其它語言的異常處理模組。在 PHP 代碼中所產生的異常可被 throw語句拋出並被 catch 語句捕獲。(註:一定要先拋才能擷取)

需要進行異常處理的代碼都必須放入 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()拋出的異常的方法:

複製代碼 代碼如下:
<?php
try {
$mgr = new CommandManager();
$cmd = $mgr->getCommandObject("realcommand");
$cmd->execute();
} catch (Exception $e) {
print $e->getMessage();
exit();
}
?>

可以看到,通過結合使用throw關鍵字和PHP中try{}catch{},我們可以避免錯誤標記“汙染”類方法返回的值。因為“異常”本身就是一種與其它任何對象不同的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程式設計有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.