任何程序員在開發時均可能遇到過一些失誤,或其餘緣由形成錯誤的發生。固然,用戶若是不肯意或不遵循應用程序的約束,也會在使用時引發一些錯誤發生。PHP程序的錯誤發生通常歸屬於下列三個領域。php
Ø 語法錯誤html
語法錯誤最多見,而且最容易修復。例如,遺漏了一個分號,就會顯示錯誤信息。這類錯誤會阻止腳本執行。一般發生在程序開發時,能夠經過錯誤報告進行修復,再從新運行。程序員
Ø 運行時錯誤web
這種錯誤通常不會阻止PHP腳本的運行,可是會阻止腳本作但願它所作的任何事情。例如,在調用header()函數前若是有字符輸出,PHP一般會顯示一條錯誤消息,雖然PHP腳本繼續運行,但header()函數並無執行成功。數據庫
Ø 邏輯錯誤編程
這種錯誤其實是最麻煩的,不但不會阻止PHP腳本的執行,也不會顯示出錯誤消息。例如,在if語句中判斷兩個變量的值是否相等,若是錯把比較運行符號「==」寫成賦值運行符號「=」就是一種邏輯錯誤,很難會被發現。數組
一個異常則是在一個程序執行過程當中出現的一個例外,或是一個事件,它中斷了正常指令的運行,跳轉到其餘程序模塊繼續執行。因此異常處理常常被當作程序的控制流程使用。不管是錯誤仍是異常,應用程序都必須可以以妥善的方式處理,並作出相應的反應,但願不要丟失數據或者致使程序崩潰。瀏覽器
運行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_reporting和display_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>
對於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則使用PHP的Mail()函數,發送信息到某E-mail處,第四個參數extra_headers亦會用到;2則將錯誤信息送到TCP 服務器中,此時第三個參數destination表示目的地IP及Port;3則將信息存到文件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事件日誌實際上與UNIX的syslog相同,這些日誌一般能夠經過事件查看器來查看。若是但願將錯誤報告寫到操做系統的日誌裏,能夠在配置文件中將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()、syslog及closelog()三個函數以前必須先調用該函數。由於在調用該函數時,它會根據如今的系統環境爲下面三個函數初使用化一些必需的常量。
Ø 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的解析工具來查看和分析日誌。但若是你的網站在共享服務器的虛擬主機中運行,就只有使用單獨的文本文件記錄錯誤日誌了。
異常(Exception)處理用於在指定的錯誤發生時改變腳本的正常流程,是PHP 5中的一個新的重要特性。異常處理是一種可擴展、易維護的錯誤處理統一機制,並提供了一種新的面向對象的錯誤處理方式。在Java、C#及Python等
語言中很早就提供了這種異常處理機制,若是你對哪種語言中的異常處理熟悉,那對PHP中提供的異常處理機制也不會陌生。
1.異常處理實現
異常處理和編寫程序的流程控制類似,因此也能夠經過異常處理實現一種另類的條件選擇結構。異常就是在程序運行過程當中出現的一些意料以外的事件,若是不對此事件進行處理,則程序在執行時遇到異常將崩潰。處理異常須要在PHP腳本中使用如下語句:
<DIV align=center>
try { //全部須要進行異常處理的代碼都必須放入這個代碼塊內 … … //在這裏可使用throw語句拋出一個異常對象 }catch(ex1) { //使用該代碼塊捕獲一個異常,並進行處理 … … //處理髮生的異常,也可再次拋出異常 } |
</DIV>
在PHP代碼中所產生的異常能夠被throw語句拋出並被catch語句捕獲。須要進行異常處理的代碼都必須放入try代碼塊內,以便捕獲可能存在的異常。每個try至少要有一個與之對應的catch,也不能出現單獨的catch,另外try和cache之間也不能有任何的代碼出現。一個異常處理的簡單實例以下所示:
<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 " |