PHP的錯誤和異常處理 - n哖苡逅 - 部落格園 http://www.cnblogs.com/laojie4321/p/4187620.html
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); //可以抛出任何非注意的錯誤報告 |
// 關閉所有PHP錯誤報告
error_reporting(0 );
// Report simple running errors
error_reporting ( E_ERROR | E_WARNING | E_PARSE );
// 報告 E_NOTICE也挺好 (報告未初始化的變量
// 或者捕獲變量名的錯誤拼寫)
error_reporting ( E_ERROR | E_WARNING | E_PARSE | E_NOTICE );
// 除了 E_NOTICE,報告其他所有錯誤
// 這是在 php.ini 裡的預設設定
error_reporting ( E_ALL ^ E_NOTICE );
// 報告所有 PHP 錯誤 (參見 changelog)
error_reporting ( E_ALL );
// 報告所有 PHP 錯誤
error_reporting (- 1 );
// 和 error_reporting(E_ALL); 一樣
ini_set ( 'error_reporting' , E_ALL );