天天看點

php try catch model,php中try catch捕獲異常執行個體詳解

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

導語: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()抛出的異常的方法:

複制代碼代碼如下:try {

$mgr = new CommandManager();

$cmd = $mgr->getCommandObject("realcommand");

$cmd->execute();

} catch (Exception $e) {

print $e->getMessage();

exit();

}

?>

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

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

例子如下:

包含檔案錯誤抛出異常

複制代碼代碼如下:// 錯誤的示範

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的後面繼續執行。多個異常的捕獲的示例如下:

複制代碼代碼如下: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."

";

}

//為這個異常自定義一個處理方法

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 "********

"; //沒有抛出異常這條語句就會正常執行

}catch(MyException $e){ //捕獲使用者自定義的異常區塊

echo "捕獲自定義的異常:$e

"; //按自定義的方式輸出異常消息

$e->customFunction(); //可以調用自定義的異常處理方法

}catch(Exception $e){ //捕獲PHP内置的異常處理類的對象

echo "捕獲預設的異常:".$e->getMessage()."

"; //輸出異常消息

}

var_dump($testObj); //判斷對象是否建立成功,如果沒有任何異常,則建立成功

//示例2,抛出自定義的異常,并通過自定義的異常處理類捕獲這個異常并處理

try{

$testObj1 =new TestException(1); //傳1時,抛出自定義異常

echo "********

"; //這個語句不會被執行

}catch(MyException $e){ //這個catch區塊中的代碼将被執行

echo "捕獲自定義的異常:$e

";

$e->customFunction();

}catch(Exception $e){ //這個catch區塊不會執行

echo "捕獲預設的異常:".$e->getMessage()."

";

}

var_dump($testObj1); //有異常産生,這個對象沒有建立成功

//示例2,抛出自内置的異常,并通過自定義的異常處理類捕獲這個異常并處理

try{

$testObj2 =new TestException(2); //傳入2時,抛出内置異常

echo "********

"; //這個語句不會被執行

}catch(MyException $e){ //這個catch區塊中的代碼将被執行

echo "捕獲自定義的異常:$e

";

$e->customFunction();

}catch(Exception $e){ //這個catch區塊不會執行

echo "捕獲預設的異常:".$e->getMessage()."

";

}

var_dump($testObj2); //有異常産生,這個對象沒有建立成功

?>

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

【php中try catch捕獲異常執行個體詳解】相關文章: