異常處理在php裡也是個很有爭議的問題,記得之前做專案的時候,關於異常處理和當時的同事討論了很久。
不過今天不討論這些東西,只是單純做個記錄。
這篇部落格分三個部分:
異常處理的基本使用
擴充套件中丟擲的異常,以pdo舉例
將錯誤資訊委託給異常處理
一些需要注意的tips:
異常處理的基本使用
需要注意以下幾點:
具體見**:
<?php
function division ($a, $b)
return $a / $b;
}try catch (exception $e)
//結果:異常**獲,輸出"division by zero"
class user_exception extends exception
function user_division ($a, $b)
return $a / $b;
}try catch (user_exception $e) catch (exception $e)
//異常**獲,輸出"division by zero"
try catch (user_exception $e) catch (exception $e)
//異常**獲,輸出"user division by zero"
try catch (user_exception $e) catch (exception $e) finally
//異常**獲,finally**被執行,輸出"division by zerofinally is excuted";
//需要特別之處,finally這個特性是由鳥哥在php5.5的版本實現的,見鳥哥的部落格
//另乙個需要注意的地方是,如果在catch**塊中返回了結果,finally還是會繼續執行,並且finally的返回值會覆蓋catch中的返回值
function testfinally () catch (exception $e) finally
}echo testfinally();
/** * catch和finally**塊均執行,輸出結果為
* catch exception
* finally executed
* 1* catch**塊的返回值被finally**塊的返回值覆蓋
*/
pdo擴充套件的demo
具體見**:
<?php
try catch (pdoexception $e)
//異常**獲,輸出"catch exception:sqlstate[hy000] [2002] connection refused"
//這個地方特別有意思,如果不設定錯誤處理方式,連線錯誤會預設丟擲乙個pdo異常,但是查詢錯誤缺省會返回false;
set_error_handler(function ($error, $errorstr) );
try catch (pdoexception $e)
//將錯誤處理設定為pdo::errmode_warning,不會丟擲異常,而是提示乙個warning資訊.
//這裡特別有意思的地方是,如果我不做處理,命令列裡會提示兩個報警資訊.如果我加入set_error_handler,將錯誤資訊列印出來,則只有乙個warning資訊.
//感覺有時間可以寫兩篇關於pdo擴充套件和php錯誤處理的部落格
將錯誤資訊委託給異常處理
具體見**:
<?php
class error_exception extends exception
}set_error_handler(function ($errno, $errstr, $errfile, $errline) );
try catch (error_exception $e)
//異常**獲,輸出"division by zero"
PHP基礎補全系列 static
昨天晚上睡了大概兩個小時。感覺今天一天整個人的狀態都特別萎靡。在手冊中,static主要實現兩個作用,1.定義靜態變數和靜態方法 2.實現後期靜態繫結 延遲靜態繫結 定義靜態變數和靜態方法主要是需要注意宣告和呼叫的方式。1.手冊中提到靜態屬性不能使用表示式宣告。這個並不嚴謹,實際測試使用類似於 2 ...
PHP系列(七)PHP錯誤異常處理
1 php錯誤報告級別 1 e error 致命的執行錯誤。錯誤無法恢復,暫停執行指令碼。2 e warning 執行時警告 非致命性錯誤 非致命的執行錯誤,指令碼執行不會停止。4 e parse 編譯時解析錯誤。解析錯誤只由分析器產生。8 e notice 執行時提醒 這些經常是你 中的bug引起...
PHP異常處理
php 4 require once cmd php4 command.php class commandmanager php if file exists path require once path if class exists cmd ret new cmd if is a ret,com...