PHP的錯誤和異常處理

任何程序員在開發時均可能遇到過一些失誤,或其餘緣由形成錯誤的發生。固然,用戶若是不肯意或不遵循應用程序的約束,也會在使用時引發一些錯誤發生。PHP程序的錯誤發生通常歸屬於下列三個領域。php

Ø  語法錯誤html

語法錯誤最多見,而且最容易修復。例如,遺漏了一個分號,就會顯示錯誤信息。這類錯誤會阻止腳本執行。一般發生在程序開發時,能夠經過錯誤報告進行修復,再從新運行。程序員

Ø  運行時錯誤web

這種錯誤通常不會阻止PHP腳本的運行,可是會阻止腳本作但願它所作的任何事情。例如,在調用header()函數前若是有字符輸出,PHP一般會顯示一條錯誤消息,雖然PHP腳本繼續運行,但header()函數並無執行成功。數據庫

Ø  邏輯錯誤編程

這種錯誤其實是最麻煩的,不但不會阻止PHP腳本的執行,也不會顯示出錯誤消息。例如,在if語句中判斷兩個變量的值是否相等,若是錯把比較運行符號「==」寫成賦值運行符號「=」就是一種邏輯錯誤,很難會被發現。數組

一個異常則是在一個程序執行過程當中出現的一個例外,或是一個事件,它中斷了正常指令的運行,跳轉到其餘程序模塊繼續執行。因此異常處理常常被當作程序的控制流程使用。不管是錯誤仍是異常,應用程序都必須可以以妥善的方式處理,並作出相應的反應,但願不要丟失數據或者致使程序崩潰。瀏覽器

10.1.1  錯誤類型和基本的調試方法

運行PHP腳本時,PHP解析器會盡其所能地報告它遇到的問題。在PHP中錯誤報告的處理行爲,都是經過PHP的配置文件php.ini中有關的配置指令肯定的。另外PHP的錯誤報告有不少種級別,能夠根據不一樣的錯誤報告級別提供對應的調試方法。一旦把PHP設置成呈現出發生了哪些錯誤,你可能想調整錯誤報告的級別。在表10-1中列出了PHP中大多數的錯誤報告級別。安全

10-1  PHP的錯誤報告級別服務器

<DIV align=center>

級別常量

錯誤報告描述

E_ERROR 

致命的運行時錯誤(它會阻止腳本的執行)

E_WARNING 

運行時警告(非致命的錯誤)

E_PARSE 

從語法中解析錯誤

E_NOTICE 

運行時注意消息(多是或者可能不是一個問題)

E_CORE_ERROR 

相似E_ERROR,但不包括PHP核心形成的錯誤

E_CORE_WARNING 

相似E_WARNING,但不包括PHP核心錯誤警告

E_COMPILE_ERROR 

致命的編譯時錯誤

E_COMPILE_WARNING 

致命的編譯時警告

E_USER_ERROR 

用戶致使的錯誤消息

E_USER_WARNING 

用戶致使的警告

E_USER_NOTICE 

用戶致使的注意消息

E_ALL 

全部的錯誤、警告和注意

E_STRICT

關於PHP版本移植的兼容性和互操做性建議

</DIV>

若是用戶但願在PHP腳本中,遇到上表中的某個級別的錯誤時,將錯誤消息報告給用戶。則必須在配置文件php.ini中,將display_errors指令的值設置爲On,開啓PHP輸出錯誤報告的功能。也能夠在PHP腳本中調用ini_set()函數,動態設置配置文件php.ini中的某個指令。若是display_errors被啓用,就會顯示知足已設置的錯誤級別的全部錯誤。當用戶在訪問時,看到顯示的這些消息不只會感到迷惑,並且還可能會過多地泄露有關服務器的信息,使服務器變得很不安全。因此在項目開發或測試期間啓用此指令,能夠根據不一樣的錯誤報告更好的調試程序。出於安全性和美感的目的,讓公衆用戶查看PHP的詳細出錯消息通常是不明智的,因此在網站投入使用時要將其禁用。

當你正在開發站點時,你將但願PHP報告特定類型的錯誤,能夠經過調整錯誤報告的級別實現,能夠經過如下兩種方法設置錯誤報告級別。

Ø  能夠經過在配置文件php.ini中,修改配置指令error_reporting的值,修改爲功後從新啓動Web服務器,則每一個PHP腳本均可以按調整後的錯誤級別輸出錯誤報告。下面是修改php.ini配置文件的示例,列出幾種爲error_reporting指令設置不一樣級別值的方式,能夠把位運算符[&(與)、|(或)、~(非)]和錯誤級別常量一塊兒使用。以下所示:

<DIV align=center>

; 能夠拋出任何非注意的錯誤,默認值

error_reporting = E_ALL & ~E_NOTICE

; 只考慮致命的運行時錯誤、解析錯誤和核心錯誤

; error_reporting = E_ERROR | E_PARSE | E_CORE_ERROR

; 報告除用戶致使的錯誤以外的全部錯誤

; error_reporting = E_ALL & ~(E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE)

</DIV>

Ø  或者能夠在PHP腳本中使用error_reporting()函數,基於各個腳原本調整這種行爲。這個函數用於肯定PHP應該在特定的頁面內報告哪些類型的錯誤。該函數獲取一個數字或上表中錯誤級別常量做爲參數。以下所示:

<DIV align=center>

error_reporting(0);                                 //設置爲0會徹底關閉錯誤報告

error_reporting (E_ALL);                          //將會向PHP報告發生的每一個錯誤

error_reporting (E_ALL & ~E_NOTICE);           //能夠拋出任何非注意的錯誤報告

</DIV>

在下面的示例中,咱們在PHP腳本中分別建立出一個「注意」、一個「警告」和一個致命「錯誤」。並經過設置不一樣的錯誤級別,限制程序輸出沒有被容許的錯誤報告。建立一個名爲error.php的腳本文件,代碼以下所示:

<DIV align=center>

<html>

         <head><title>測試錯誤報告</title></head>

         <body>

                   <h2>測試錯誤報告</h2>

                   <?php

                            /*開啓php.ini中的display_errors指令,只有該指令開啓若是有錯誤報告才能輸出*/

                            ini_set('display_errors',1); 

                            /*經過error_reporting()函數設置在本腳本中,輸出全部級別的錯誤報告*/

                            error_reporting(E_ALL);

                            /*「注意(notice)」的報告,不會阻止腳本的執行,而且可能不必定是一個問題 */

                            getType($var);             //調用函數時提供的參數變量沒有在以前聲明

                            /*「警告(warning)」的報告,指示一個問題,可是不會阻止腳本的執行 */

                            getType();                 //調用函數時沒有提供必要的參數

                            /*「錯誤(error)」的報告,它會終止程序,腳本不會再向下執行 */

                            get_Type();                //調用一個沒有被定義的函數

                   ?>

         </body>

</html>

</DIV>

在上面的腳本中,爲了確保配置文件中的display_errors指令開啓,經過ini_set()函數強制在該腳本執行中啓動,並經過error_repoting()函數設置錯誤級別爲E_ALL,報告全部錯誤、警告和注意。並在腳本中分別建立出注意、警告和錯誤,PHP腳本只有在遇到錯誤時纔會終止運行,輸出的錯誤報告結果如圖10-1所示。

 

10-1  輸出錯誤報告結果的演示

「注意」和「警告」的錯誤報告並不會終止程序運行。若是在上面的輸出結果中,不但願有注意和警告的報告輸出,就能夠在腳本error.php中修改error_repoting()函數,修改的代碼以下所示:

<DIV align=center>

error_reporting(E_ALL&~(E_WARNING | E_NOTICE));        //報告除注意和警告以外的全部錯誤

</DIV>

腳本error.php被修改之後並從新運行,在輸出的結果中就只剩下一條錯誤報告了,如圖10-2所示。

 

10-2  屏蔽「注意」和「警告」後的輸出結果

除了使用error_reportingdisplay_error兩個配置指令能夠修改錯誤報告行爲之外,還有許多配置指令能夠肯定PHP的錯誤報告行爲。其餘的一些重要的指令如表10-2所示。

10-2  肯定PHP錯誤報告行爲的配置指令

<DIV align=center>

配置指令

描    述

默 認 值

display_startup_errors

是否顯示PHP引擎在初始化時遇到的全部錯誤

Off

log_errors

肯定日誌語句記錄的位置

Off

error_log

設置錯誤能夠發送到syslog

Null

log_errors_max_len

每一個日誌項的最大長度,以字節爲單位,設置0表示指定最大長度

1024

ignore_repeated_errors

是否忽略同一文件、同一行發生的重複錯誤消息

Off

ignore_repeated_source

忽略不一樣文件中或同一文件中不一樣行上發生的重複錯誤

Off

track_errors

啓動該指令會使PHP$php_errormsg中存儲最近發生的錯誤信息

Off

</DIV>

10.1.2  錯誤日誌

對於PHP開發者來講,一旦某個產品投入使用,應該當即將display_errors選項關閉,以避免由於這些錯誤所透露的路徑、數據庫鏈接、數據表等信息而遭到黑客攻擊。可是,任何一個產品在投入使用後,都不免會有錯誤出現,那麼如何記錄一些對開發者有用的錯誤報告呢?咱們能夠在單獨的文本文件中將錯誤報告做爲日誌記錄。錯誤日誌的記錄,能夠幫助開發人員或者管理人員查看系統是否存在問題。

若是須要將程序中的錯誤報告寫入錯誤日誌中,只要在PHP的配置文件中,將配置指令log_errors開啓便可。錯誤報告默認就會記錄到Web服務器的日誌文件裏,例如記錄到Apache服務器的錯誤日誌文件error.log中。固然也能夠記錄錯誤日誌到指定的文件中或發送給系統syslog,分別介紹以下:

1.使用指定的文件記錄錯誤報告日誌

若是使用本身指定的文件記錄錯誤日誌,必定要確保將這個文件存放在文檔根目錄以外,以減小遭到攻擊的可能。而且該文件必定要讓PHP腳本的執行用戶(Web服務器進程全部者)具備寫權限。假設在Linux操做系統中,將/usr/local/目錄下的error.log文件做爲錯誤日誌文件,並設置Web服務器進程用戶具備寫的權限。而後在PHP的配置文件中,將error_log指令的值設置爲這個錯誤日誌文件的絕對路徑。須要將php.ini中的配置指令作以下修改:

<DIV align=center>

error_reporting  =  E_ALL                        ;將會向PHP報告發生的每一個錯誤

display_errors = Off                            ;不顯示知足上條指令所定義規則的全部錯誤報告

log_errors = On                                ;決定日誌語句記錄的位置

log_errors_max_len = 1024                        ;設置每一個日誌項的最大長度

error_log = /usr/local/error.log                      ;指定產生的錯誤報告寫入的日誌文件位置

</DIV>

PHP的配置文件按上面的方式設置完成之後,並從新啓動Web服務器。這樣,在執行PHP的任何腳本文件時,所產生的全部錯誤報告都不會在瀏覽器中顯示,而會記錄在本身指定的錯誤日誌/usr/local/error.log中。此外,不只能夠記錄知足error_reporting所定義規則的全部錯誤,並且還可使用PHP中的error_log()函數,送出一個用戶自定義的錯誤信息。該函數的原型以下所示:

<DIV align=center>

bool error_log ( string message [, int message_type [, string destination [, string extra_headers]]] )

</DIV>

此函數會送出錯誤信息到Web服務器的錯誤日誌文件、某個TCP服務器或到指定文件中。該函數執行成功則返回TRUE,失敗則返回FALSE。第一個參數message 是必選項,即爲要送出的錯誤信息。若是僅使用這一個參數,會按配置文件php.ini中所設置的位置處發送消息。第二個參數message_type爲整數值:0表示送到操做系統的日誌中;1則使用PHPMail()函數,發送信息到某E-mail處,第四個參數extra_headers亦會用到;2則將錯誤信息送到TCP 服務器中,此時第三個參數destination表示目的地IPPort3則將信息存到文件destination中。若是以登入Oracle數據庫出現問題的處理爲例,該函數的使用以下所示:

<DIV align=center>

<?php  

         if(!Ora_Logon($username, $password)){  

                   error_log("Oracle數據庫不可用!", 0);               //將錯誤消息寫入到操做系統日誌中

         }

         if(!($foo=allocate_new_foo()){

                   error_log("出現大麻煩了!", 1, "webmaster@www.mydomain.com");   //發送到管理員郵箱中

         }

         error_log("搞砸了!",   2,   "localhost:5000");            //發送到本機對應5000端口的服務器中

         error_log("搞砸了!",   3,   "/usr/local/errors.log");        //發送到指定的文件中

?> 

</DIV>

2.錯誤信息記錄到操做系統的日誌裏

錯誤報告也能夠被記錄到操做系統日誌裏,但不一樣的操做系統之間的日誌管理有點區別。在Linux上錯誤語句將送往syslog,而在Windows上錯誤將發送到事件日誌裏。若是你不熟悉syslog,起碼要知道它是基於UNIX的日誌工具,它提供了一個API來記錄與系統和應用程序執行有關的消息。Windows事件日誌實際上與UNIXsyslog相同,這些日誌一般能夠經過事件查看器來查看。若是但願將錯誤報告寫到操做系統的日誌裏,能夠在配置文件中將error_log指令的值設置爲syslog。具體須要在php.ini中修改的配置指令以下所示:

<DIV align=center>

error_reporting  =  E_ALL                      ;將會向PHP報告發生的每一個錯誤

display_errors = Off                                   ;不顯示知足上條指令所定義規則的全部錯誤報告

log_errors = On                               ;決定日誌語句記錄的位置

log_errors_max_len = 1024                      ;設置每一個日誌項的最大長度

error_log = syslog                             ;指定產生的錯誤報告寫入操做系統的日誌裏

</DIV>

除了通常的錯誤輸出以外,PHP還容許向系統syslog中發送定製的消息。雖然經過前面介紹的error_log()函數,也能夠向syslog中發送定製的消息,但在PHP中爲這個特性提供了須要一塊兒使用的4個專用函數。分別介紹以下:

 

Ø  define_syslog_variables()

在使用openlog()syslogcloselog()三個函數以前必須先調用該函數。由於在調用該函數時,它會根據如今的系統環境爲下面三個函數初使用化一些必需的常量。

Ø  openlog()

打開一個和當前系統中日誌器的鏈接,爲向系統插入日誌消息作好準備。並將提供的第一個字符串參數插入到每一個日誌消息中,該函數還須要指定兩個將在日誌上下文使用的參數,能夠參考官方文檔使用。

Ø  syslog()

該函數向系統日誌中發送一個定製消息。須要兩個必選參數,第一個參數經過指定一個常量定製消息的優先級。例如LOG_WARNING表示通常的警告,LOG_EMERG表示嚴重地能夠預示着系統崩潰的問題,一些其餘的表示嚴重程度的常量能夠參考官方文檔使用。第二個參數則是向系統日誌中發送的定製消息,須要提供一個消息字符串,也能夠是PHP引擎在運行時提供的錯誤字符串。

Ø  closelog()

該函數在向系統日誌中發送完成定製消息之後調用,關閉由openlog()函數打開的日誌鏈接。

若是在配置文件中,已經開啓向syslog發送定製消息的指令,就可使用前面介紹的四個函數發送一個警告消息到系統日誌中,並經過系統中的syslog解析工具,查看和分析由PHP程序發送的定製消息,以下所示:

<DIV align=center>

<?php

         define_syslog_variables();

         openlog("PHP5", LOG_PID , LOG_USER);

         syslog(LOG_WARNING, "警告報告向syslog中發送的演示,警告時間:".date("Y/m/d H:i:s"));

         closelog();

?>

</DIV>

Windows系統爲例,經過右擊「個人電腦」選擇管理選項,而後到系統工具菜單中,選擇事件查看器,再找到應用程序選項,就能夠看到咱們本身定製的警告消息了。上面這段代碼將在系統的syslog文件中,生成相似下面的一條信息,是事件的一部分:

<DIV align=center>

PHP5[3084], 警告報告向syslog中發送的演示,警告時間:2009/03/26 04:09:11.

</DIV>

使用指定的文件仍是使用syslog記錄錯誤日誌,取決於你所在的Web服務器環境。若是你能夠控制Web服務器,使用syslog是最理想的,由於你能利用syslog的解析工具來查看和分析日誌。但若是你的網站在共享服務器的虛擬主機中運行,就只有使用單獨的文本文件記錄錯誤日誌了。

10.1.3  異常處理

異常(Exception)處理用於在指定的錯誤發生時改變腳本的正常流程,是PHP 5中的一個新的重要特性。異常處理是一種可擴展、易維護的錯誤處理統一機制,並提供了一種新的面向對象的錯誤處理方式。在Java、C#及Python等

語言中很早就提供了這種異常處理機制,若是你對哪種語言中的異常處理熟悉,那對PHP中提供的異常處理機制也不會陌生。

1.異常處理實現

異常處理和編寫程序的流程控制類似,因此也能夠經過異常處理實現一種另類的條件選擇結構。異常就是在程序運行過程當中出現的一些意料以外的事件,若是不對此事件進行處理,則程序在執行時遇到異常將崩潰。處理異常須要在PHP腳本中使用如下語句:

<DIV align=center>

try {                     //全部須要進行異常處理的代碼都必須放入這個代碼塊內

   … …                  //在這裏可使用throw語句拋出一個異常對象

}catch(ex1) {               //使用該代碼塊捕獲一個異常,並進行處理

   … …                 //處理髮生的異常,也可再次拋出異常

}

</DIV>

PHP代碼中所產生的異常能夠被throw語句拋出並被catch語句捕獲。須要進行異常處理的代碼都必須放入try代碼塊內,以便捕獲可能存在的異常。每個try至少要有一個與之對應的catch,也不能出現單獨的catch,另外trycache之間也不能有任何的代碼出現。一個異常處理的簡單實例以下所示:

<DIV align=center>

<?php

         try {

                   $error = 'Always throw this error';

                   throw new Exception($error);      //建立一個異常對象,經過throw語句拋出

                   echo 'Never executed';            //從這裏開始,try代碼塊內的代碼將不會再被執行

         } catch (Exception $e) {

                   echo 'Caught exception: ',  $e->getMessage(), "\n";  //輸出捕獲的異常消息

         }

         echo 'Hello World';                    //程序沒有崩潰繼續向下執行

?>

</DIV>

在上面的代碼中,若是try代碼塊中出現某些錯誤,咱們就能夠執行一個拋出異常的操做。在某些編程語言中,例如Java,在出現異常時將自動拋出異常。而在PHP中,異常必須手動拋出。throw關鍵字將觸發異常處理機制,它是一個語言結構,而不是一個函數,但必須給它傳遞一個對象做爲值。在最簡單的狀況下,能夠實例化一個內置的Exception類,就像以上代碼所示那樣。若是在try語句中有異常對象被拋出,該代碼塊不會再繼續向下執行,而直接跳轉到catch中執行。並傳遞給catch代碼塊一個對象,也能夠理解爲被catch代碼塊捕獲的對象,其實就是致使異常被throw語句拋出的對象。在catch代碼塊中能夠簡單的輸出一些異常的緣由,也能夠是try代碼塊中任務的另外一個版本解決方案,此外,也能夠在這個catch代碼塊中產生新的異常。最重要的是,在異常處理以後,程序不會崩潰,而會繼續執行。

2.擴展PHP內置的異常處理類

try代碼塊中,須要使用throw語句拋出一個異常對象,才能跳轉到catch代碼塊中執行,並在catch代碼塊中捕獲並使用這個異常類的對象。雖然在PHP中提供的內置異常處理類Exception,已經具備很是不錯的特性,但在某些狀況下,可能還要擴展這個類來獲得更多的功能。因此用戶能夠用自定義的異常處理類來擴展PHP內置的異常處理類。如下的代碼說明了在內置的異常處理類中,哪些屬性和方法在子類中是可訪問和可繼承的:

內置的異常處理類(Exception

<DIV align=center>

<?php

         class Exception {

           protected $message = 'Unknown exception';              //異常信息

           protected $code = 0;                              //用戶自定義異常代碼

           protected $file;                                   //發生異常的文件名

           protected $line;                                  //發生異常的代碼行號

 

           function __construct($message = null, $code = 0){}    //構造方法

 

           final function getMessage(){}                        //返回異常信息

           final function getCode(){}                           //返回異常代碼

           final function getFile(){}                            //返回發生異常的文件名

       final function getLine(){}                            //返回發生異常的代碼行號

         final function getTrace(){}                           //backtrace() 數組

          final function getTraceAsString(){}                    //已格成化成字符串的 getTrace() 信息

 

           /* 可重載的方法 */

           function __toString(){}                             //可輸出的字符串

         }

?>

</DIV>

上面這段代碼只爲說明內置異常處理類Exception的結構,它並非一段有實際意義的可用代碼。若是使用自定義的類做爲異常處理類,則必須是擴展內置異常處理類Exception的子類,非Exception類的子類是不能做爲異常處理類使用的。若是在擴展內置處理類Exception時從新定義構造函數的話,建議同時調用parent::construct()來檢查全部的變量是否已被賦值。當對象要輸出字符串的時候,能夠重載__toString()並自定義輸出的樣式。能夠在自定義的子類中,直接使用內置異常處理Exception類中的全部成員屬性,但不能從新改寫從該父類中繼承過來的成員方法,由於該類的大多數公有方法都是final的。

建立自定義的異常處理程序很是簡單,和傳統類的聲明方式相同,但該類必須是內置異常處理類Exception的一個擴展。當PHP中發生異常時,可調用自定義異常類中的方法進行處理。建立一個自定義的MyException類,繼承了內置異常處理類Exception中的全部屬性,並向其添加了自定義的方法。代碼及應用以下所示:

擴展PHP內置的異常處理類的應用

<DIV align=center>

<?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 "按自定義的方法處理出現的這個類型的異常<br>";

                   }

         }

        

         try {                                    //使用自定義的異常類捕獲一個異常,並處理異常

                   $error = '容許拋出這個錯誤';      

                   throw new MyException($error);         //建立一個自定義的異常類對象,經過throw語句拋出

                   echo 'Never executed';                 //從這裏開始,try代碼塊內的代碼將不會再被執行

         } catch (MyException $e) {                 //捕獲自定義的異常對象

                   echo '捕獲異常: '.$e;                  //輸出捕獲的異常消息

                   $e->customFunction();                //經過自定義的異常對象中的方法處理異常

         }

         echo '你好呀';                             //程序沒有崩潰繼續向下執行

?>

</DIV>

在自定義的MyException類中,使用父類中的構造方法檢查全部的變量是否已被賦值。並且重載了父類中的__toString()方法,輸出本身定製捕獲的異常消息。自定義和內置的異常處理類,在使用上沒有多大區別,只不過在自定義的異常處理類中,能夠調用爲具體的異常專門編寫的處理方法。

3.捕獲多個異常

try代碼塊以後,必須至少給出一個catch代碼塊,也能夠將多個catch代碼塊與一個try代碼塊進行關聯。若是每一個catch代碼塊能夠捕獲一個不一樣類型的異常,那麼使用多個catch就能夠捕獲不一樣的類所產生的異常。當產生一個異常時,PHP將查詢一個匹配的catch代碼塊。若是有多個catch代碼塊,傳遞給每個catch代碼塊的對象必須具備不一樣的類型,這樣PHP能夠找到須要進入哪個catch代碼塊。當try代碼塊再也不拋出異常或者找不到catch能匹配所拋出的異常時,PHP代碼就會在跳轉到最後一個 catch 的後面繼續執行。多個異常的捕獲的示例以下:

內置的異常處理類(Exception

<DIV align=center>

<?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 Exception("傳入的值「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 "

相關文章
相關標籤/搜索