PHP的錯誤和異常處理


任何程序員在開發時都可能遇到過一些失誤,或其他原因造成錯誤的發生。當然,用戶如果不願意或不遵循應用程序的約束,也會在使用時引起一些錯誤發生。PHP程序的錯誤發生一般歸屬於下列三個領域。

Ø  語法錯誤

語法錯誤最常見,並且最容易修復。例如,遺漏了一個分號,就會顯示錯誤信息。這類錯誤會阻止腳本執行。通常發生在程序開發時,可以通過錯誤報告進行修復,再重新運行。

Ø  運行時錯誤

這種錯誤一般不會阻止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 "


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM