任何程序員在開發時都可能遇到過一些失誤,或其他原因造成錯誤的發生。當然,用戶如果不願意或不遵循應用程序的約束,也會在使用時引起一些錯誤發生。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_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>
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則使用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的解析工具來查看和分析日志。但如果你的網站在共享服務器的虛擬主機中運行,就只有使用單獨的文本文件記錄錯誤日志了。
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,另外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 " |
