天天看點

PHP的錯誤和異常處理

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 );