《PHP教程:php中try catch捕獲異常實例詳解》要點:
本文介紹了PHP教程:php中try catch捕獲異常實例詳解,希望對您有用。如果有疑問,可以聯系我們。
PHP教程本文實例講述了php中try catch捕獲異常.分享給大家供大家參考.具體辦法分析如下:
PHP教程php中try catch可以贊助我們捕獲程序代碼的異常了,這樣我們可以很好的處理一些不必要的錯誤了,感興趣的朋友可以一起來看看.
PHP教程PHP中try{}catch{}語句概述
PHP教程PHP5添加了類似于其它語言的異常處理模塊.在 PHP 代碼中所產生的異常可被 throw語句拋出并被 catch 語句捕獲.(注:一定要先拋才能獲取)
PHP教程需要進行異常處理的代碼都必須放入 try 代碼塊內,以便捕獲可能存在的異常.
PHP教程每一個 try 至少要有一個與之對應的 catch.
PHP教程使用多個 catch可以捕獲不同的類所產生的異常.
PHP教程當 try 代碼塊不再拋出異常或者找不到 catch 能匹配所拋出的異常時,PHP 代碼就會在跳轉到最后一個 catch 的后面繼續執行.
PHP教程當然,PHP允許在 catch 代碼塊內再次拋出(throw)異常.
PHP教程當一個異常被拋出時,其后(譯者注:指拋出異常時所在的代碼塊)的代碼將不會繼續執行,而 PHP 就會嘗試查找第一個能與之匹配的 catch.
PHP教程如果一個異常沒有被捕獲,而且又沒用使用 set_exception_handler() 作相應的處理的話,那么 PHP 將會產生一個嚴重的錯誤,并且輸出 Uncaught Exception ... (未捕獲異常)的提示信息.
PHP教程先來看一下PHP內置異常類的基本屬性和辦法.(不包括具體實現)
代碼如下:
try{
}
catch(){
throw new Exception();
}
catch(){
//這里可以捕獲到前面一個塊拋出的Exception
}
PHP教程為了進一步處理異常,我們需要使用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內建的類型,不會產生混淆.
PHP教程如果拋出了一個異常,try語句中的腳本將會停止執行,然后馬上轉向執行catch語句中的腳本.
PHP教程例子如下:
PHP教程包含文件錯誤拋出異常
代碼如下:
<?php
// 錯誤的演示
try {
require ('test_try_catch.php');
} catch (Exception $e) {
echo $e->getMessage();
}
PHP教程// 正確的拋出異常
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.
PHP教程多個catch捕獲多個異常
PHP教程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);??????? //有異常產生,這個對象沒有創建成功
?>
PHP教程在上面的代碼中,可以使用兩個異常處理類:一個是自定義的異常處理類MyException;另一個則是PHP中內置的異常處理類Exception.分別在try區塊中創建測試類TestException的對象,并根據構造辦法中提供的不同數字參數,拋出自定義異常類對象、內置的異常類對象和不拋出任何異常的情況,跳轉到對應的catch區塊中執行.如果沒有異常發生,則不會進入任何一個catch塊中執行,測試類TestException的對象創建成功
PHP教程希望本文所述對大家的php程序設計有所贊助.
歡迎參與《PHP教程:php中try catch捕獲異常實例詳解》討論,分享您的想法,維易PHP學院為您提供專業教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/13855.html