PHP中error_reporting()用法詳解

NO IMAGE

error_reporting() 函式規定報告哪個錯誤 。該函式設定當前指令碼的錯誤報告級別。該函式返回舊的錯誤報告級別。

首先要知道error_reporting()函式是用來設定錯誤級別並返回當前級別的。它有14個錯誤級別,如下:


1    E_ERROR     致命的執行時錯誤。 錯誤無法恢復過來。指令碼的執行被暫停
2    E_WARNING    非致命的執行時錯誤。 指令碼的執行不會停止
4    E_PARSE     編譯時解析錯誤。解析錯誤應該只由分析器生成
8    E_NOTICE     執行時間的通知。
16    E_CORE_ERROR   在PHP啟動時的致命錯誤。這就好比一個在PHP核心的E_ERROR
32    E_CORE_WARNING  在PHP啟動時的非致命的錯誤。這就好比一個在PHP核心E_WARNING警告
64    E_COMPILE_ERROR 致命的編譯時錯誤。 這就像由Zend指令碼引擎生成了一個E_ERROR
128   E_COMPILE_WARNING 非致命的編譯時錯誤,由Zend指令碼引擎生成了一個E_WARNING警告
256   E_USER_ERROR   致命的使用者生成的錯誤。
512   E_USER_WARNING  非致命的使用者生成的警告。 
1024   E_USER_NOTICE  使用者生成的通知。
2048   E_STRICT     執行時間的通知。
4096   E_RECOVERABLE_ERROR 捕捉致命的錯誤。
8191   E_ALL來     所有的錯誤和警告。

好像php預設是不開啟錯誤的,所以你需要配置php.ini檔案:

將 display_errors = Off 改為display_errors = On

另外還要配置錯誤級別:將

error_reporting = E_ALL     改為:

error_reporting = E_ALL & ~E_NOTICE

應為php預設是顯示所有錯誤的,而有些無害的提示我們不需要顯示,所以設定如上!

也可以在php程式碼運用如下:


<?php
//禁用錯誤報告,也就是不顯示錯誤
error_reporting(0);
//報告執行時錯誤
error_reporting(E_ERROR | E_WARNING | E_PARSE);
//報告所有錯誤
error_reporting(E_ALL);
?>

使用示例:

今天學習CI框架過程中遇到個問題:


A PHP Error was encountered 
Severity: Notice 
Message: Undefined variable: user 

一般在預設的普通PHP檔案中輸出一個未定義宣告的變數是不會報錯誤的,但在codeigniter框架下卻要報錯誤,這對於想整合 新增 和 修改 頁面於一體的”懶人”很不方便,由於是初學者開始還想怎麼在程式碼中遮蔽這一錯誤提示呢.甚至用到了@,但聽很多人都說@會大大降低效能….

最後突然想到,是不是codeigniter有意讓這錯誤資訊提示出來了呢,我們該如何去遮蔽掉這一類錯誤呢無意中搜尋到了”如何讓codeigniter不顯示Notice資訊?”,茅塞頓開.原來是入口index.php中的error_reporting(E_ALL);在作怪.只需要把它改成
  error_reporting(E_ALL ^ E_NOTICE);
就可以遮蔽掉這個錯誤,而不影響其他的報錯.

我們在程式中可能經常看到這麼一個函式


function setErrorReporting()
{
//從配置檔案讀取當前是否為開發環境
if (DEV_ENV == true) {
ini_set("error_reprorting", "E_ALL & ~E_NOTICE");
ini_set("display_errors", "on");
} else {
error_reporting(E_ALL);
ini_set('display_errors', 'Off');
ini_set("log_errors" , "On");
ini_set('error_log', '/var/log/phperror.log');
}
}

舉例說明:
在Windows環境下:原本在php4.3.0中執行正常的程式,在4.3.1中為何多處報錯,大體提示為:Notice:Undefined varialbe:變數名稱.

例如有如下的程式碼:
 程式碼如下 複製程式碼
if (!$tmp_i) {
$tmp_i=10;
}
在4.3.0中執行正常,在4.3.1中執行會提示Notice:Undefined varialbe:tmp_i
問題如下:1.問題出在哪裡?
2.應如何修改這段程式碼?
3.不改段程式碼,如何修改php.ini中的設定使原來在4.3.0中的程式在4.3.1的環境下執行正常而不出現這個錯誤提示.
解決辦法:

在程式開頭加一句:
 程式碼如下 複製程式碼
error_reporting(E_ALL & ~E_NOTICE); 或error_reporting(E_ALL ^ E_NOTICE);
或者修改php.ini:
 程式碼如下 複製程式碼
error_reporting = E_ALL & ~E_NOTICE
有關error_reporting()函式: error_reporting() 設定 PHP 的報錯級別並返回當前級別。
; 錯誤報告是按位的。或者將數字加起來得到想要的錯誤報告等級。
; E_ALL – 所有的錯誤和警告
; E_ERROR – 致命性執行時錯
; E_WARNING – 執行時警告(非致命性錯)
; E_PARSE – 編譯時解析錯誤
; E_NOTICE – 執行時提醒(這些經常是是你的程式碼的bug引起的,也可能是有意的行為造成的。(如:基於未初始化的變數自動初始化為一個空字串的事實而使用一個未初始化的變數)
; E_CORE_ERROR – 發生於PHP啟動時初始化過程中的致命錯誤
; E_CORE_WARNING – 發生於PHP啟動時初始化過程中的警告(非致命性錯)
; E_COMPILE_ERROR – 編譯時致命性錯
; E_COMPILE_WARNING – 編譯時警告(非致命性錯)
; E_USER_ERROR – 使用者產生的出錯訊息
; E_USER_WARNING – 使用者產生的警告訊息
; E_USER_NOTICE – 使用者產生的提醒訊息
E_NOTICE 表示一般情形不記錄,只有程式有錯誤情形時才用到,例如企圖存取一個不存在的變數,或是呼叫 stat() 函式檢視不存在的檔案。
E_WARNING 通常都會顯示出來,但不會中斷程式的執行。這對除錯很有效。例如:用有問題的常規表示法呼叫 ereg()。
E_ERROR 通常會顯示出來,亦會中斷程式執行。意即用這個遮罩無法追查到記憶體配置或其它的錯誤。
E_PARSE 從語法中剖析錯誤。
E_CORE_ERROR 類似 E_ERROR,但不包括 PHP 核心造成的錯誤。
E_CORE_WARNING 類似 E_WARNING,但不包括 PHP 核心錯誤警告

使用方法:
error_reporting(0);//禁用錯誤報告
error_reporting(E_ALL ^ E_NOTICE);//顯示除去 E_NOTICE 之外的所有錯誤資訊
error_reporting(E_ALL^E_WARNING^E_NOTICE);//顯示除去E_WARNING E_NOTICE 之外的所有錯誤資訊
error_reporting(E_ERROR | E_WARNING | E_PARSE);//顯示執行時錯誤,與error_reporting(E_ALL ^ E_NOTICE);效果相同。error_reporting(E_ALL);//顯示所有錯誤
error_reporting(0)
error_reporting(255);
是列出所有提示
error_reporting(0);
是不顯示所有提示
建議使用
error_reporting(7);
只顯示嚴重錯誤
1 E_ERROR 致命的執行時錯誤
2 E_WARNING 執行時警告(非致命性錯誤)
4 E_PARSE 編譯時解析錯誤
8 E_NOTICE 執行時提醒(經常是bug,也可能是有意的)
16 E_CORE_ERROR PHP啟動時初始化過程中的致命錯誤
32 E_CORE_WARNING PHP啟動時初始化過程中的警告(非致命性錯)
64 E_COMPILE_ERROR 編譯時致命性錯
128 E_COMPILE_WARNING 編譯時警告(非致命性錯)
256 E_USER_ERROR 使用者自定義的致命錯誤
512 E_USER_WARNING 使用者自定義的警告(非致命性錯誤)
1024 E_USER_NOTICE 使用者自定義的提醒(經常是bug,也可能是有意的)
2048 E_STRICT 編碼標準化警告(建議如何修改以向前相容)
4096 E_RECOVERABLE_ERROR 接近致命的執行時錯誤,若未被捕獲則視同E_ERROR
6143 E_ALL 除E_STRICT外的所有錯誤(PHP6中為8191,即包含所有)

您可能感興趣的文章:

PHP的error_reporting錯誤級別變數對照表PHP中error_reporting()函式的用法(修改PHP遮蔽錯誤)PHP函式之error_reporting(E_ALL ^ E_NOTICE)詳細說明PHP中error_reporting函式用法詳細介紹