本文章介紹了在php中常用的簡(jiǎn)單的異常處理類,我們主要是講述到了Exception處理,代碼如下:
- <?php
- try {
- $a=10/0;
- }catch (Exception $e){
- echo "拋出異常";
- }
- ?>
以上代碼,并不會(huì)輸出“拋出異常”,而是輸出了錯(cuò)誤信息:Warning: Division by zero in......
說明:try塊中并沒有拋出異常,而是按照系統(tǒng)默認(rèn)的錯(cuò)誤處理機(jī)制進(jìn)行處理,所以能不能捕獲到異常,取決于有沒有真正的拋出異常.代碼如下:
- <?php
- class Exception
- {
- protected $message = 'Unknown exception'; // 異常信息
- protected $code = 0; // 用戶自定義異常代碼
- protected $file; // 發(fā)生異常的文件名
- protected $line; // 發(fā)生異常的代碼行號(hào)
- function __construct($message = null, $code = 0);
- final function getMessage(); // 返回異常信息
- final function getCode(); // 返回異常代碼
- final function getFile(); // 返回發(fā)生異常的文件名
- final function getLine(); // 返回發(fā)生異常的代碼行號(hào)
- final function getTrace(); // backtrace() 數(shù)組
- final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息
- /* 可重載的方法 */
- function __toString(); // 可輸出的字符串
- }
- ?>
簡(jiǎn)單的使用如下:(通過異常,拋出錯(cuò)誤信息),代碼如下:
- try {
- $error = 'my error!';
- throw new Exception($error)
- } catch (Exception $e) {
- echo $e->getMessage();
- }
我們可以擴(kuò)展此類,方便我們的使用,代碼如下:
- class MyException extends Exception
- {
- // 重定義構(gòu)造器使 message 變?yōu)楸仨毐恢付ǖ膶傩?/span>
- public function __construct($message, $code = 0) {
- // 自定義的代碼
- // 確保所有變量都被正確賦值
- parent::__construct($message, $code);
- }
- // 自定義字符串輸出的樣式
- public function __toString() {
- return __CLASS__ . ": [{$this->code}]: {$this->message}n";
- }
- public function customFunction() {
- echo "A Custom function for this type of exceptionn";
- }
- }
異常處理的基本思想是代碼在try代碼被調(diào)用執(zhí)行。如果try碼塊出現(xiàn)錯(cuò)誤,我們可以執(zhí)行一個(gè)拋出異常的處理,某些編程語言,如java,在特定情況下將自動(dòng)拋出異常。在php中,異常必須手動(dòng)拋出,可以使用如下方式拋出一個(gè)異常,代碼如下:
Throw new Exception(‘message’,code);
Throw 關(guān)鍵字將觸發(fā)異常處理機(jī)制,它是一個(gè)語言結(jié)構(gòu),而不是一個(gè)函數(shù),但是必須給它傳遞一個(gè)值。它要求一個(gè)接受對(duì)象。在最簡(jiǎn)單的情況下,可以實(shí)例化一個(gè)內(nèi)置的Exception類。
最后,在try代碼之后,必須至少給出一個(gè)catch代碼塊。可以將多個(gè)catch代碼塊與一個(gè)try代碼塊進(jìn)行關(guān)聯(lián)。如果每個(gè)catch代碼塊可以捕獲一個(gè)不同類型的異常,可以使用多個(gè)catch代碼塊是有意義的。例如,如果想捕獲Exception類的異常,代碼如下
- Catch(Exception $e)
- {
- //handing exception
- }
Catch代碼捕獲的對(duì)象就是導(dǎo)致異常并傳遞給throw語句的對(duì)象(被throw 語句拋出)。使用Exception 類的實(shí)例,是不錯(cuò)的選擇。
Exception類提供了如下的內(nèi)置方法:
Getcode() —返回傳遞給構(gòu)造函數(shù)的代碼。
GetMessage() —返回傳遞給構(gòu)造函數(shù)的消息。
getFile() —返回產(chǎn)生異常代碼的文件的路徑
getLine() —返回產(chǎn)生異常的代碼所在的行。
注意:當(dāng)捕獲到一個(gè)異常后,try()塊里面的后續(xù)代碼將不會(huì)繼續(xù)執(zhí)行,而是會(huì)嘗試查找匹配的“catch”代碼塊,當(dāng)拋出一個(gè)異常后,如果不進(jìn)行catch處理,則會(huì)報(bào)“Uncaught exception 'Exception'”錯(cuò)誤,代碼如下:
- <?php
- function test($val){
- if ($val>100){
- throw new Exception("提示信息:您輸入的值過大");
- }
- }
- test(111);
- ?>
當(dāng)一個(gè)異常拋出后,catch語句塊可以進(jìn)行處理也可以不處理,以下是我用戶注冊(cè)功能的部分代碼
- try{
- //check forms filled in
- if(!filled_out($_POST)){
- throw new Exception('你還沒有填寫表單,請(qǐng)回去填寫');
- }
- //check email address not valid
- if(!check_email($email)){
- throw new Exception('郵件的格式不正確');
- }
- //檢查密度的長(zhǎng)度是否大于6
- if(strlen($passwd<6)){
- throw new Exception('密度的長(zhǎng)度應(yīng)該大于6');
- }
- //檢查兩次密碼是否相等
- if($passwd!=$passwd1){
- throw new Exception('兩次密碼不一樣,請(qǐng)重新輸入');
- }
- //檢查用戶名的長(zhǎng)度是否正確
- if(strlen($username)>16){
- throw new Exception('用戶名的長(zhǎng)度不符,請(qǐng)重新輸入');
- }
- } catch(Exception $e){
- echo $e->getMessage(); //輸出異常信息。
- }
php對(duì)異常的處理與java一樣,用到的是try{}catch(){},定義頂級(jí)異常處理器用到的函數(shù)是:set_exception_handler("My_exception");這里的My_expection是開發(fā)者自定義的異常處理函數(shù),既頂級(jí)異常處理器,只有當(dāng)程序中沒有函數(shù)來處理異常才有頂級(jí)異常處理器來處理異常,如果沒有定義頂級(jí)異常處理器,則由系統(tǒng)默認(rèn)的異常處理器來處理異常,舉例說明:
- <meta http-equiv="content-type" content="text/html;charset=utf-8" /><?php
- set_exception_handler("My_expection");
- function My_expection(){
- echo "這里是頂級(jí)異常處理器";
- }
- try{
- nohello("hello");
- }catch(Exception $e){
- throw $e;
- }
- function nohello($nohello){
- if($nohello == "hello"){
- throw new Exception("不能輸入hello");
- }else{
- echo "輸入成功";
- }
- }
- ?>
新聞熱點(diǎn)
疑難解答