php中try catch捕獲異常例項詳解
- php語言
- 關注:2.26W次
導語: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 (Exception $e) {
echo $e->getMessage();
}
// 正確的丟擲異常
try {
if (file_exists('test_try_')) {
require ('test_try_');
} 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的物件建立成功
- 文章版權屬於文章作者所有,轉載請註明 https://xuezhezhai.com/zh-tw/jsj/php/qdoenm.html