PHP基礎05---檔案處理
錯誤級別
詳見這裡
錯誤處理
指的是系統(或使用者)在對某些程式碼進行執行的時候,發現有錯誤,就會通過錯誤處理的形式告知程式設計師
一、錯誤分類
- 語法錯誤:不符合php語法規範,無法編譯更無法執行。(parse error
- 執行錯誤:程式碼執行過程中會出現一些條件不滿足導致的錯誤(runtime error
- 邏輯錯誤:雖然能執行,但得不到想要的結果
二、錯誤代號
錯誤代號在php中都被定義成了系統常量(可直接使用
-
系統錯誤:
- E_PARSE:編譯錯誤,程式碼不會執行。
- E_ERROR:fatal error,致命錯誤,程式碼無法執行
- E_WARNING:warning,警告錯誤,不會影響程式碼執行,但是可能得到意想不到的結果
- E_NOTICE:notice,通知錯誤,不會影響程式碼執行
-
使用者錯誤:E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE.
使用者在使用自定義錯誤觸發的時候,會使用到的錯誤代號(系統不會用到
-
其他:E_ALL,代表著所有的錯誤(通常在錯誤控制的時候比較多),建議在開發過程中(開發環境)使用
所有以E開頭的錯誤常量(代號)其實都是由一個位元組儲存,然後每一種錯誤佔據一個對應的位,如果想進行一些錯誤的控制,可以使用位運算操作。
//排除通知級別:
notice: E_ALL & ~E_NOTICE
//只要警告和通知:
E_WARNING |E_NOTICE
三、錯誤觸發
程式執行時觸發:系統自動根據錯誤發生後,對比對應的錯誤資訊,輸出給使用者:主要針對程式碼的語法錯誤和執行時的錯誤
人為錯誤:如果某些邏輯可能會出錯,從而使用對應的判斷程式碼來觸發相應的錯誤提示
<?php header('Content-type:text/html;charset=utf-8'); $a = 100; echo $a; $b = 0; if($b == 0){ //人為觸發錯誤 trigger_error('除數不能為0!'); //預設notice,會繼續執行。 //通過第二個引數嚴格控制 trigger_error('除數不能為0!',E_USER_ERROR); //預設error,程式碼下面不會繼續執行。 } echo 'yyds';
錯誤顯示設定
哪些錯誤該顯示,以及如何顯示
兩種方式就來設定當前指令碼的錯誤處理
-
1.php的配置檔案:全域性配置:php.ini檔案
display_errors:是否顯示錯誤
error_reporting:顯示什麼級別的錯誤
-
2.可以在執行的php指令碼中設定(指令碼中定義的配置級別比配置檔案高。)(通常在開發當中都會在指令碼中設定。
error_reporting():
ini_set('error_reporting',E_ALL);
ini_set('display_errors',1);
error_reporting(-1)顯示所有錯誤,error_reporting(0)遮蔽所有錯誤。ini_set('error_reporting',0)也是遮蔽所有錯誤。可以在php.ini檔案中設定error_reporting來使指令碼顯示或不顯示某些錯誤。ini_set('display_errors','On')顯示錯誤。
注意:error_reporting()設定報告何種錯誤,而ini_set('display_errors','On')設定是否在輸出錯誤。因而error_reporting(-1)和ini_set('display_errors',0)可用作設定日誌:報告錯誤並且不輸出。
----出處
錯誤日誌設定
在實際生產環境中,不會直接讓錯誤直接顯示給使用者。
為啥?
- 對使用者不友好
- 不安全:會暴露路徑和檔名等資訊。
這時候,暴露出來的錯誤需要儲存到日誌檔案中,需要在php配置檔案中或者程式碼中(ini_set)設定對應的error_log配置項
設定error_log配置項
-
開啟日誌功能:在php.ini中找到log_errors ,確保其 = On
-
在php.ini中找到error_log=syslog,在它下面加入路徑。比如:error_log = 'E:/server/php8/errorlog/php_errors.log'
自定義錯誤處理
最簡單的錯誤處理:trigger_errors()函式,但是不會組織系統報錯。
php系統提供了一種使用者處理錯的的機制,使用者自定義錯誤處理函式,然後將該函式增加作業系統處理的控制代碼中,然後系統會在碰到系統後使用使用者定義的錯誤函式
-
如何將使用者自定義的函式放到系統中?set_error_handler();
-
自定義錯誤處理函式,系統有要求(詳見上面的連結
系統後期呼叫該自定義函式的時候,會給第一個和第二個傳遞對應的引數。(第一個第二個引數必須存在。
<?php
/*@param1 $errno ,是系統提供的錯誤程式碼:E_ALL、E_NOTICE..*/
function mye($errno,$errstr,$errfile,$errline){
//判斷當前會碰到的錯誤有哪些
//這一步是排除當前本身系統就要排除的錯誤
if(error_reporting() & $errno)//error_reporting沒有引數時,代表獲取當前系統錯誤處理對應的級別,對應errornumber
return false;
//判斷錯誤型別。
switch($errno){
case E_ERROR:
case E_USER_ERROR:
echo 'fatal error in file'.$errfile . ' on line '.errline . '<br/>';
echo'error info:' . $errstr;
break;
case E_WARNING;
case E_USER_WARNING:
echo 'Warning in file '. $errfile.' on line '. $errline . '<br/>';
echo 'error info:' . $errstr;
break;
case E_NOTICE;
case E_USER_NOTICE:
echo 'Notice in file '. $errfile.' on line '. $errline . '<br/>';
echo 'error info:' . $errstr;
break;
}
return true;
}
//未定義$a,用來報錯
echo $a;
//修改錯誤機制
set_error_handler('檔名');
echo $a;
當前屬於簡單自定義模式,如果要複雜,可以在某些影響程式碼功能的錯誤發生後,讓使用者跳轉到某個指定介面。