PHP錯誤處理執行個體方法

來源:互聯網
上載者:User

1. Php錯誤預設處理方法

在 PHP 中,預設的錯誤處理很簡單。一條訊息會被發送到瀏覽器,這條訊息帶有檔案名稱、行號以及一條描述錯誤的訊息。在建立指令碼和 web 應用程式時,錯誤處理是一個重要的部分。如果您的代碼缺少錯誤偵測編碼,那麼程式看上去很不專業,也為安全風險敞開了大門。

2. 改進處理方法:

1. 簡單的 "die()" 語句

2. error_reporting(); 設定PHP 的報錯層級並返回當前層級

3. 自訂錯誤和錯誤觸發器

3. PHP錯誤層級:

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 啟用 PHP 對代碼的修改建議,以確保代碼具有最佳的互通性和向前相容性。

4096 E_RECOVERABLE_ERROR 捕捉致命的錯誤。

8191 E_ALL 所有的錯誤和警告。

4. php錯誤報表:

php預設是不開啟錯誤報表的,要提示錯誤有兩種方法:

1. 配置php.ini檔案:

將 display_errors =Off 改為display_errors = On

php預設是顯示所有錯誤的,而有些無害的提示我們不需要顯示,另外還要配置錯誤層級:將error_reporting = E_ALL 改為:error_reporting= E_ALL & ~E_NOTICE

另:錯誤回顯,一般常用於開發模式,但是錯誤回顯可以暴露出非常多的敏感資訊,為攻擊者下一步攻擊提供便利。在正式環境下推薦關閉此選項,同時將log_error=on , 此時若出現錯誤,則提示:伺服器錯誤,但是不會出現錯誤提示而把錯誤資訊記錄在日誌裡。

2. 在程式裡添加

<?php  error_reporting(0); // 關閉錯誤報表  error_reporting(E_ERROR | E_WARNING | E_PARSE); // 報告 runtime 錯誤  error_reporting(E_ALL); // 報告所有錯誤  error_reporting(E_ALL & ~E_NOTICE); // 報告 E_NOTICE 之外的所有錯誤?>

5. 自訂錯誤處理器和錯誤觸發器

自訂的錯誤處理器:
user_error_function(error_level,error_message,error_file,error_line,error_context)(使用者自己定義,用在set_error_handler中調用)

error_level:必選(錯誤層級)

error_message:必選(使用者定義的錯誤規定錯誤訊息)

error_file,error_line,error_context:可選 (發生錯誤的檔案,行號等資訊)

set_error_handler():

如果使用了該函數,會完全繞過標準的 PHP 錯誤處理函數(error_reporting ()將會失效),如果必要,使用者定義的錯誤處理程式必須終止 (die() ) 指令碼。

set_error_handler() 僅需要一個參數(自訂的錯誤處理器),可以添加第二個參數來規定錯誤層級。

trigger_error()觸發錯誤

在指令碼中使用者輸入資料的位置,當使用者的輸入無效時觸發錯誤的很有用的。可以在指令碼中任何位置觸發錯誤,通過添加的第二個參數,您能夠規定所觸發的錯誤層級。可能的錯誤類型:E_USER_ERROR, E_USER_WARNING, E_USER_NOTIC.

例子:

//自訂錯誤處理器function myErrorHandler($errno, $errstr, $errfile,$errline){    if(!(error_reporting() &$errno)){return;}    switch ($errno){    case E_USER_ERROR:        echo "<b>MyERROR</b> [$errno] $errstr<br/>";        echo "錯誤行:$errline 在檔案:$errfile之中<br/>";        echo " PHP版本: " .PHP_VERSION ." (" .PHP_OS .")<br/>";        break;    case E_USER_WARNING:        echo "<b>MyWARNING</b> [$errno] $errstr<br/>";        break;    case E_USER_NOTICE:        echo "<b>MyNOTICE</b> [$errno] $errstr<br />";        break;    default:        echo "Unknown error type:[$errno] $errstr<br />";        break;    }    return true;}//測試函數functiontrigger_test($age){   if($age <= 0|| $age > 999)    trigger_error("年齡不合法:$age歲",E_USER_ERROR);if($age < 18)         trigger_error("未成年:$age歲",E_USER_WARNING);if($age > 40&& $age < 100)     trigger_error("年齡稍大:$age歲",E_USER_NOTICE);}//如果只是簡單統一地處理錯誤:$errorHandler = set_error_handler("myErrorHandler");trigger_test(1000);//會拋出一個error級的錯誤//如果要分別處理不同錯誤層級則需要構造不同層級的錯誤處理器function myError($errno, $errstr,$errfile, $errline){    //具體處理方法}function myWarning($errno, $errstr, $errfile, $errline){    //具體處理方法}function myNtice($errno, $errstr, $errfile, $errline){    //具體處理方法}set_error_handler('myError',E_USER_ERROR);set_exception_handler('myWarning',E_USER_WARNING);set_exception_handler('myNtice',E_USER_NOTICE);trigger_error('故意拋出個錯誤,還是很嚴重的哪一種!',E_USER_ERROR);

6. 屏蔽PHP錯誤提示

方法一:

在有可能出錯的函數前加@,然後or die("")

如: @mysql_connect(...) or die("Database Connect Error")

註:@其實它是錯誤抑制符,即即使出現錯誤,也無視出現的錯誤資訊,繼續執行下邊的代碼;好處是不會輸出錯誤資訊。

Or die當在指令碼中調用die()和exit()時,將會終止整個指令碼。它們都可用於阻止指令碼繼續執行,而使得某些重要的操作(如建立一條資料庫連接)不會發生。你還可以給die()和exit()傳遞一個將在瀏覽器中列印出來的字串。

方法二:

編輯php.ini ,將"display_errors =off" , 同時將log_error=on, error_log = /var/log/php-error.log

方法三:

在php指令碼前加error_reporting(0),屏蔽所有錯誤提示。
其中,error_reporting 配置錯誤資訊回報的等級。
文法:int error_reporting(int [level]);
傳回值:整數
函數種類:PHP 系統功能

相關推薦:

PHP錯誤處理方法執行個體

php錯誤處理和日誌記錄

PHP錯誤處理方法總結_PHP教程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.